我需要从文件中读取两列(两个String),并将第一列的值保存在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值时,我发现值与origianl文件中的值的顺序不同
for (Map.Entry<Integer, String> token:tokens.entrySet())
{
System.out.println(token.getKey() + token.getValue());
}
我得到以下
1 Apple
3 Pen
4 whatever
2 ..etc
我不知道是什么问题?!能帮助我吗
答案 0 :(得分:16)
正如文档明确指出的那样,HashMaps 无序 枚举顺序由键的hascodes确定。
如果要在枚举地图时保留广告订单,请使用LinkedHashMap
如果您希望枚举顺序遵循键的自然顺序,请使用TreeMap
。
答案 1 :(得分:6)
HashMap
未订购。您无法控制项目的显示顺序。如果您需要有序地图,则可以使用TreeMap
。
编辑:感谢那些提出这个问题的人:TreeMap
会将项目保留在自然排序顺序中(例如按字母顺序排列)。 LinkedHashMap
将保留插入顺序。
答案 2 :(得分:2)
如果要重新插入订单,请使用LinkedHashMap。默认情况下,HashMap的迭代器不保证插入顺序。
答案 3 :(得分:2)
HashMap
不是有序的Collection
。 (它甚至不是Collection
)它更像是一本字典。
如果您想坚持商品的顺序,可以使用TreeMap
或LinkedHashMap
。
这些之间的区别在于TreeMap
按照自然排序顺序对其进行排序,而LinkedHashMap
保留了广告订单。
在大多数情况下,如果您希望使用List
,可以使用LinkedHashMap
。
TreeMap
使用红黑树进行内部实施,LinkedHashMap
使用双向链表。
我的建议是你应该参考官方documentation。你会找到详尽的解释。
此外,迭代Map
的惯用方法是:
for(Integer key : map.keySet()) {
String myString = map.get(key);
// ...
}