0

我有这个

import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.Scanner;
import static java.lang.System.*;

public class Relatives
{
    private Map<String,Set<String>> map;


    public Relatives()
    {
        map = new TreeMap<String,Set<String>>();
    }

    public void setPersonRelative(String line)
    {
        String[] personRelative = line.split(" ");
        String person = personRelative[0];
        String relative = personRelative[1];

        if(map.containsKey(person))
        {
            map.get(person).add(relative);
        }
        else
        {
            Set<String> relatives = new TreeSet<String>();
            relatives.add(relative);
            map.put(person,relatives);
        }
    }

    /**
     * Returns the String version of the set containing person's relatives
     * (see last line of sample output)
     * @param person the person whose relative set should be returned as a String
     * @param the string version of person's relative set
     */
    public String getRelatives(String person)
    {
        return map.keySet();
    }

我怎样才能将地图作为字符串返回并使其看起来像这样

Bob 与 John 有关 Tom
Dot 与 Chuck Fred Jason Tom
Elton 与 Linh 有关

我已经尝试过类型转换,尽管我认为它不会起作用并且解析它也不起作用,而这就是我目前所拥有的

4

1 回答 1

1

我会从这样的事情开始:

public String getRelatives(String person)
{        
    StringBuilder sb = new StringBuilder();
    sb.append(person);
    sb.append(" is related to ");
    for(String relative : map.get(person))
    {
        sb.append(relative);
        sb.append(' ');
    }
    return sb.toString();
}

或者,如果您想变得更复杂一些,并处理某人与任何人没有关系的情况:

public String getRelatives(String person)
{   
    StringBuilder sb = new StringBuilder();
    sb.append(person);
    Set<String> relatives = map.get(person);
    if(relatives == null || relatives.isEmpty())
    {
        sb.append("is not related to anyone.");
    }
    else
    {
        sb.append(" is related to ");
        for(String relative : relatives)
        {
            sb.append(relative);
            sb.append(' ');
        }
    }
    return sb.toString();
}

如果您正确初始化了地图,并且地图映射到的集合,您应该没问题。

基本上你创建一个StringBuilder(这可能是矫枉过正,但它仍然是一个很好的做法),用你想要的东西填充它,然后调用它的.toString()方法。

for 循环只是遍历 的内容Set,并将相对的名称填充到 StringBuilder 中,以及一个空格字符以将内容隔开。


其他注意事项:

private Map<String,Set<String>> map;


public Relatives()
{
    map = new TreeMap<String,Set<String>>();
}

只能是:

private Map<String, Set<String>> map = new TreeMap<String, Set<String>>();

或者,如果使用 Java 7,只需:

private Map<String, Set<String>> map = new TreeMap<>();

(请注意,这样,如果只是用于初始化地图,则不需要显式构造函数)

我也会改变这个:

if(map.containsKey(person))
{
    map.get(person).add(relative);
}
else
{
    Set<String> relatives = new TreeSet<String>();
    relatives.add(relative);
    map.put(person,relatives);
}

至:

if(!map.containsKey(person))
{
    map.put(person, new TreeSet<String>());
}
map.get(person).add(relative);

更简单,避免冗余

于 2013-09-27T00:01:48.317 回答