排序的hashmap迭代

时间:2011-10-26 07:14:41

标签: java

我有这样的代码:

HashMap<Long, TempPosition> positions = getTempPositions();
    for (SortedMap.Entry<Long, TempPosition> p: positions.entrySet()) {...}

问题是“位置”未排序或无效排序。迭代hashmap并保存当前顺序的最简单方法是什么?

谢谢

7 个答案:

答案 0 :(得分:9)

根据定义,HashMap没有订单。如果您需要保留或创建某种订单,则需要使用TreeMap代替HashMap

答案 1 :(得分:4)

HashMap没有任何订单。如果需要插入顺序,请使用LinkedHashMap。如果要使用自然顺序或自定义比较器对键进行排序,请使用TreeMap。

答案 2 :(得分:4)

HashMap没有订单。你甚至不能保证具有相同键的两个HashMaps具有相同的顺序。

如果您想要使用TreeMapLinkedHashMap的订单,迭代器将按照集合提供的顺序。


注意:在某些情况下,密钥会被排序,因此密钥甚至不是随机的。

HashMap<Integer, String> map = new HashMap<>();
for(int i=0;i<10;i++)
    map.put(i, ""+i);
System.out.println(map.keySet());

打印

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

答案 3 :(得分:1)

您可以使用java.util.SortedMap的实现,例如java.util.TreeMap而不是HashMap。

答案 4 :(得分:1)

 SortedSet<String> sortedset= new TreeSet<String>(positions.keySet());

    Iterator<String> it = sortedset.iterator();

    while (it.hasNext()) {
      System.out.println (it.next());
    }

答案 5 :(得分:1)

由于密钥可以排序,这种方法最简单:

HashMap<Long, TempPosition> positions = getTempPositions();
for (Map.Entry<Long, TempPosition> p: 
    new TreeMap<Long, TempPosition>( positions ).entrySet()) {...}

诀窍是将地图包裹在TreeMap中。请注意,如果地图很大,这不起作用。

答案 6 :(得分:1)

这里有使用流和经典foreach循环的示例代码:

HashMap<String,String> map = new HashMap<>();
map.put("c", "C");
map.put("a", "A");
map.put("b", "B");

for (Map.Entry<String,String> e : (Iterable<Map.Entry<String,String>>) map.entrySet().stream().sorted(Map.Entry.comparingByKey())::iterator) {
    System.out.println("key:" + e.getKey() + ", val: " + e.getValue());
}