繁体   English   中英

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

[英]How to iterate a HashMap using the natural entrySet() order?

我的 Map 包含按字母顺序排序的键。 当我显示它时,我使用的是 entrySet().iterator(),但我的结果不是按字母顺序排列的。 我怎样才能按顺序获得我的结果?

不,您的 map 不按字母顺序保存元素。 您可能有.put(..)然后按该顺序,但 map 没有定义的迭代顺序。

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

此实现(LinkedHashMap)使其客户免于 HashMap(和 Hashtable)提供的未指定、通常混乱的排序,而不会增加与 TreeMap 相关的成本

使用树图

基于红黑树的NavigableMap实现。 map 根据其键的自然顺序排序,或由 map 创建时间提供的Comparator器排序,具体取决于使用哪个构造函数...

我的 Map 包含按字母顺序排序的键

这不是真的。

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

由于HashMap使用散列将条目存储在底层容器中,因此无法保证任何特定顺序。 如果您想订购HashMap中的条目,您必须自己对它们进行排序。

另一方面, TreeMap将保持某种顺序(您可以通过实现Comparable接口自己指定),因此如果您设置了它的条目,它将按字母顺序出现。 String已经实现了Comparable ,因此它们将按字母顺序返回给您。

您可以使用ConcurrentSkipListMapTreeMap

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM