如何使用自然的entrySet()顺序迭代HashMap?

时间:2011-08-11 16:03:27

标签: java collections

我的地图包含按字母顺序排序的键。当我显示它时,我正在使用entrySet()。iterator(),但我的结果不是按字母顺序排列。 如何按顺序获得我的结果?

6 个答案:

答案 0 :(得分:14)

不,您的地图不按字母顺序保存元素。您可能按顺序排列.put(..),但地图没有定义的迭代顺序。

其他人建议使用SortedSet,但您也可以使用LinkedHashMap。它保证了迭代顺序:

  

这个实现(LinkedHashMap)使客户端免受HashMap(和Hashtable)提供的未指定的,通常是混乱的排序,而不会导致与TreeMap相关的成本增加

答案 1 :(得分:12)

使用TreeMap

  

基于红黑树的NavigableMap实施。地图根据其键的natural ordering或地图创建时提供的Comparator进行排序,具体取决于使用的构造函数...

答案 2 :(得分:1)

  

我的地图包含按字母顺序排列的键

事实并非如此。

使用http://download.oracle.com/javase/6/docs/api/java/util/SortedMap.html或在迭代前对键进行排序

答案 3 :(得分:1)

由于HashMap使用散列来存储基础容器中的条目,因此无法保证任何特定的顺序。如果您希望订购HashMap的商品,则必须自行分类。

另一方面,TreeMap将保持某种顺序(你可以通过实现Comparable接口来指示自己),所以如果你得到它的入口集,它将按字母顺序找到你。 String已经实现了Comparable,因此它们将按字母顺序返回给您。

答案 4 :(得分:1)

您可以使用ConcurrentSkipListMapTreeMap

答案 5 :(得分:0)

对于在 2020 年及以后发现此问题的任何人...
现在我们有了流,您可以执行以下操作:

map.entrySet()
  .stream()
  .sorted(Map.Entry.comparingByKey())
  .forEach(System.out::println);