5

我需要从文件中读取两列(均为字符串)并将第一列的值保存在 HashMap 中,其中 Integer 是计数器。

例如,如果我正在阅读的文件是

Apple Fruit
PC    Device
Pen   Tool
...

代码是

    String line="";
    int counter=1;
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("test.txt"),"Unicode"));
    while ((line = reader.readLine()) != null)
    {
        String[] words;
        words= st.split(" ");
            tokens.put(counter, words[0]);
        counter+=1;
    }

问题是当我打印 HashMap 值时,我发现这些值的顺序与原始文件中的顺序不同

        for (Map.Entry<Integer, String> token:tokens.entrySet())
    {
        System.out.println(token.getKey() + token.getValue());
    }

我得到了以下

1   Apple
3   Pen
4   whatever
2   ..etc

不知道是什么问题?!你能帮帮我吗

4

4 回答 4

25

正如文档明确指出的那样,HashMap 是无序的。
枚举顺序由键的hascode 决定。

如果要在枚举地图时保留插入顺序,请使用LinkedHashMap.
如果您希望枚举顺序遵循键的自然顺序,请使用TreeMap.

于 2013-05-31T18:06:01.600 回答
6

HashMap没有订购。您无法控制项目出现的顺序。如果您想要一个有序的地图,您可以使用,例如,TreeMap

编辑:感谢那些提出这个问题的人:TreeMap将使项目保持自然排序顺序(即在您的情况下按字母顺序排列)。 LinkedHashMap将保留插入顺序。

于 2013-05-31T18:06:38.963 回答
3

如果您想要返回插入顺序,请使用 LinkedHashMap 。默认情况下,HashMap 的迭代器不保证插入顺序。

于 2013-05-31T18:07:34.447 回答
2

HashMap不是有序的Collection。(它甚至不是Collection) 它更像是一本字典。

如果您想保持项目的顺序,您可以使用 aTreeMap或 a LinkedHashMap

它们之间的区别在于TreeMap保持它们的自然排序顺序,同时LinkedHashMap保持插入顺序。

在大多数情况下,如果您希望使用 a 之类的东西,List您可以使用LinkedHashMap.

TreeMap内部实现使用红黑树,同时LinkedHashMap使用双向链表。

我的建议是你应该参考官方文档。在那里你会找到详尽的解释。

此外,迭代Maps 的惯用方法是:

for(Integer key : map.keySet()) {
    String myString = map.get(key);
    // ...
}
于 2013-05-31T18:17:04.637 回答