咨询:为什么这个哈希表打破我?

时间:2013-11-18 04:45:30

标签: java debugging key hashtable

我无法理解下面编写的代码的行为。见:

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);所以它再次查看我上面使用的密钥,它可以第二次找到该密钥值就好了。

有人可以向我解释出现了什么问题吗?我保证会给那些回答对我的问题有意义的人。

3 个答案:

答案 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 "