【发布时间】:2013-12-01 03:49:50
【问题描述】:
我无法理解我在下面编写的代码的行为。见:
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);
}
注意:
hashmap 的格式为<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");
其中“波兰”是哈希表的已知文档/关键字。但它什么也不返回。但是,作为健全性检查,如果我输入ArrayList<String> temp2 = hashmap.get(s);,那么它再次查看我在上面使用的键,它可以再次找到该键值就好了。
有人可以向我解释发生了什么问题吗?我保证向任何对我的问题做出有意义的答复的人提供代表。
【问题讨论】:
-
如果您包含一个 SSCCE 会很有帮助。
-
我强烈支持包含SSCCE 的建议。几乎可以肯定,问题出在您所发布的内容之外。产生 SSCCE 的行为可以通过显示对您认为不相关的事物的依赖来直接解决问题。如果没有,发布 SSCCE 将允许其他人调试。
-
如果这是 SSCCE,老实说我不会问这个问题。我正在处理一个 3K 大小的哈希表。上面的例子抓住了我问题的本质。如果 s1 像我希望的那样返回,例如 hashmap.get("poland") 应该返回 2、Doc1、Doc2。但是,我得到空值。因此,我的问题。我恭敬地觉得 SSCCE 在这里错过了我的问题的重点。
-
“如果这是一个 SSCCE,老实说我不会问这个问题。”这不是重点吗? “上面的例子抓住了我问题的本质。”鉴于问题在于您如何填充哈希图,而大卫华莱士的回答因您的编辑而变得不正确,我会说不。
标签: java debugging key hashtable