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

问题描述 投票:3回答:3

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

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);returns为该条目null。换句话说,列表是空的。

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

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

其中“poland”是哈希表的已知文档/关键字。但它什么也没有回报。然而,作为一个完整性检查,如果我把ArrayList<String> temp2 = hashmap.get(s);这样看着我再次使用上面的键,它可以第二次找到该键值就好了。

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

java debugging key hashtable
3个回答
1
投票

我注意到你在ArrayList上做了一些额外的字符修剪。难道你的关键值和你的ArrayList值会以不同的方式被削减吗?

例如:s1 = "Poland"但哈希表中的实际密钥,即你的s,是s = " Poland "


4
投票

你的问题是你从一个ArrayList对象(例如"Poland""Iceland"等)中获取了一个值,然后在地图中查找具有该值作为其键的条目。但关键是"Doc1""Doc2"等,而不是"Poland""Iceland"


1
投票

简而言之,前者(ArrayList<String> temp = hashmap.get(s))的作用是因为这是关键,如下所示:

String s = keyiterator.next();

也,

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

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

© www.soinside.com 2019 - 2024. All rights reserved.