将map的返回字符串格式化为字符串但会出错

时间:2013-09-26 23:57:07

标签: java

我有这个

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();
    }

如何将地图作为字符串返回并使其看起来像这样

  鲍勃与约翰汤姆有关   Dot与Chuck Fred Jason Tom相关   埃尔顿与Linh有关

我尝试过类型转换,虽然我不认为它会工作和解析哪些也没有用,而且这是我目前的

1 个答案:

答案 0 :(得分: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);

更简单,并避免冗余