我无法理解下面编写的代码的行为。见:
Set<String> keys = hashmap.keySet();
Iterator<String> keyiterator = keys.iterator();
while(keyiterator.hasNext()) {
out = "";
String s = keyiterator.next();
ArrayList<String> temp = hashmap.get(s);
out = out + temp.get(0);
for(int i = 1; i < temp.size(); i ++)
{
String s1 = temp.get(i);
s1 = s1.replaceAll("\\[\\[", "");
s1 = s1.replaceAll("\\]\\]", "");
s1 = s1.trim();
System.out.println(s1);
ArrayList<String> temp2 = hashmap.get(s1);
if(temp2 != null) out = out + " " + temp2.get(0);
}
System.out.println(out);
}
注意:
散列图的格式为<String, ArrayList<String>>
ArrayList在位置0处有一个数值。例如,
Key = Doc1 List = 0, Poland, Iceland, Candy
Key = Doc2 List = 1, UK, Yule
Key = Poland List = 2, Doc1, Doc2
Key = Iceland List = 3, Doc1, Poland
每个列表条目至少包含数字条目。
问题:
此ArrayList<String> temp = hashmap.get(s);
返回条目列表。
但是ArrayList<String> temp2 = hashmap.get(s1);
为条目返回null。换句话说,列表是空的。
问题: 简单的说。为什么?一旦我们剥离了左右方块(参见上面代码的replaceALL部分),字符串列表就是哈希表中的键名。我试过这个:
ArrayList<String> temp2 = hashmap.get("poland");
其中“poland”是哈希表的已知文档/关键字。但它什么也没有回报。但是,作为一个完整性检查,如果我放ArrayList<String> temp2 = hashmap.get(s);
所以它再次查看我上面使用的密钥,它可以第二次找到该密钥值就好了。
有人可以向我解释出现了什么问题吗?我保证会给那些回答对我的问题有意义的人。
答案 0 :(得分:4)
您的问题是,您从其中一个ArrayList
对象(例如"Poland"
,"Iceland"
等)中获取了值,然后在地图中查找条目将该值作为其键。但密钥是"Doc1"
,"Doc2"
等等,而不是"Poland"
和"Iceland"
。
答案 1 :(得分:1)
简而言之,前者(ArrayList<String> temp = hashmap.get(s)
)有效,因为这是关键,如下所示:
String s = keyiterator.next();
另外,
“...为条目返回null。换句话说,列表为空。”
我不同意这一点。如果使用地图中不存在的键,它只返回null。
答案 2 :(得分:1)
我注意到你在ArrayList
上正在修剪额外的字符。您的关键值和ArrayList
值是否会以不同的方式进行修剪?
例如:s1 = "Poland"
但哈希表中的实际密钥(即您的s)是s = " Poland "
?