HashMap .get()为除最后一个值之外的每个值返回null

时间:2018-05-01 19:14:52

标签: java string null hashmap

我有一个不同名字的文件:

Thomas Danny
Jack Thomas
Danny Mike
Thomas Kate
Victor James

编辑:我在名称之间有单个空格,因此它正确分割,这不是问题。

每一对代表谁邀请参加聚会的人 我的任务是通过HashMap到达周期的底部。 例如,当以“凯特”作为参数时,程序需要打印出“杰克”,因为托马斯邀请凯特和杰克邀请托马斯。

到目前为止我的代码:

 Map<String, String> whoInvited = new HashMap<>();
    String[] pairs = text.split("\n");
    for (String pair : pairs){
        String[] invite = pair.split(" ");
        whoInvited.put(invite[1], invite[0]);
    }

    System.out.println(whoInvited.size())
    //Returns 5
    System.out.println(whoInvited.get("Danny"));
    //Returns null
    System.out.println(whoInvited.get("James"));
    //The only one that returns anything besides null(returns "Victor")

    String lookingFor = "Kate";
    while (whoInvited.containsKey(lookingFor)){
        lookingFor = whoInvited.get(lookingFor);
    }
    System.out.println(lookingFor);
}

我不明白HashMap是如何搞砸的。如果我在for-loop中使用.get()函数,它会完美地给出我的值,但是在循环结束后,它会变得混乱,只有最后一个值。

打印出whoInvited只给我“= Victor}”

编辑:固定!

4 个答案:

答案 0 :(得分:1)

它没有放置空值,你有空格分隔的内容。拆分空格时,会得到许多空值,因为您有多个连续的空格:

"Thomas    Danny".split(" ")
==> String[5] { "Thomas", "", "", "", "Danny" }

这解释了为什么invite[1]解析为空字符串。由于地图键是唯一的,每个空白键都会覆盖前一个,而您只剩下最后一个。

你可以通过分割任意数量的连续空格来解决问题:

"Thomas    Danny".split(" +")
==> String[2] { "Thomas", "Danny" }

答案 1 :(得分:0)

您在空白处拆分行,但这会导致在字符串中的空格之间发出空字符串。对于您的示例,这意味着invite[1]几乎总是""

这意味着密钥将始终为相同的值,从而导致仅保留最后一个值。 要解决此问题,您应该使用正则表达式分割来处理多个空格,如\s+,然后拆分中的值将是实际的字符串。

答案 2 :(得分:0)

名称之间有多个空格。你应该更好地使用正则表达式进行拆分。 尝试pair.split(&#34; +&#34;)

更新: 你的文件格式是unix还是windows ??? 试试这个分裂新行: String lines [] = string.split(&#34; \ r?\ n&#34;);

答案 3 :(得分:0)

您遇到的问题是由于不同操作系统的行结尾不同。 Windows使用\r\n,而Unix使用\n。分裂\n时,由于\r,会发生一些奇怪的事情。用text.split("\n")替换text.split("\r\n")将解决Windows的问题。