我有一个不同名字的文件:
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}”
编辑:固定!
答案 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的问题。