【问题标题】:Inquiry: Why is this hashtable breaking on me?询问:为什么这个哈希表对我来说是崩溃的?
【发布时间】: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 的格式为&lt;String, ArrayList&lt;String&gt;&gt;

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&lt;String&gt; temp = hashmap.get(s); 返回条目的列表。 但是ArrayList&lt;String&gt; temp2 = hashmap.get(s1);为该条目返回null。换句话说,列表是空的。

问题: 简单的说。为什么?一旦我们剥离了左右方块(参见上面代码的 replaceALL 部分),字符串列表就是哈希表中的键名。我试过这个:

ArrayList<String> temp2 = hashmap.get("poland");

其中“波兰”是哈希表的已知文档/关键字。但它什么也不返回。但是,作为健全性检查,如果我输入ArrayList&lt;String&gt; temp2 = hashmap.get(s);,那么它再次查看我在上面使用的键,它可以再次找到该键值就好了。

有人可以向我解释发生了什么问题吗?我保证向任何对我的问题做出有意义的答复的人提供代表。

【问题讨论】:

  • 如果您包含一个 SSCCE 会很有帮助。
  • 我强烈支持包含SSCCE 的建议。几乎可以肯定,问题出在您所发布的内容之外。产生 SSCCE 的行为可以通过显示对您认为不相关的事物的依赖来直接解决问题。如果没有,发布 SSCCE 将允许其他人调试。
  • 如果这是 SSCCE,老实说我不会问这个问题。我正在处理一个 3K 大小的哈希表。上面的例子抓住了我问题的本质。如果 s1 像我希望的那样返回,例如 hashmap.get("poland") 应该返回 2、Doc1、Doc2。但是,我得到空值。因此,我的问题。我恭敬地觉得 SSCCE 在这里错过了我的问题的重点。
  • “如果这是一个 SSCCE,老实说我不会问这个问题。”这不是重点吗? “上面的例子抓住了我问题的本质。”鉴于问题在于您如何填充哈希图,而大卫华莱士的回答因您的编辑而变得不正确,我会说不。

标签: java debugging key hashtable


【解决方案1】:

我注意到您正在对ArrayList 上的多余字符进行一些修剪。会不会是您的键值和 ArrayList 值正在以不同的方式修剪?

例如:s1 = "Poland" 但哈希表中的实际键,即您的 s,是 s = " Poland " 吗?

【讨论】:

  • 你很好地理解了我的问题。我试图让 s1 = "poland" 识别。我修剪了 s1,但它没有用。我尝试了 s 并没有奏效。当我创建哈希表并且它工作时,我修剪了我的密钥。谢谢
  • 很高兴听到。当你说它返回 null 时,我的第一个想法是它们的键值不匹配。很高兴我的建议有所帮助。
【解决方案2】:

您的问题是您从ArrayList 对象之一(例如"Poland""Iceland" 等)中获取一个值,然后在地图中寻找一个将该值作为其 键。但密钥是"Doc1""Doc2" 等等,而不是"Poland""Iceland"

【讨论】:

  • 谢谢。我修改了我的示例哈希表,以便更清楚地传达我的意思。
【解决方案3】:

简而言之,前者 (ArrayList&lt;String&gt; temp = hashmap.get(s)) 有效,因为这是关键,如下所示:

String s = keyiterator.next();

还有,

"...为条目返回 null。换句话说,列表为空。"

我不同意这一点。如果您使用地图中不存在的键,它只会返回 null。

【讨论】:

  • 感谢您的及时回复。我这样做是为了进行健全性检查。我意识到了这一点,但我想知道为什么 s1 值不起作用?
  • @GeekyOmega 那么,s.equals(s1) 是否返回 true?
  • 不应该。让我再解释一下。 s 是一些键,例如“波兰”。然后我们得到字符串的键列表。我们遍历它们。 s1 是该迭代中的一些字符串。 s1 可以是值“Doc1”,我们想要获取 ArrayList 中的第一个值,即“Doc1”的数字。如果你看上面的例子,应该是 0。
猜你喜欢
  • 2020-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 2014-08-04
  • 1970-01-01
相关资源
最近更新 更多