[英]Sorted Iteration of HashMap Java
我知道HashMap没有排序,但是我可以创建任何迭代器来按键的排序顺序返回值的迭代器。 我可以使用集合的排序版本,但是我正在寻找一种基于散列图的方法。
任何此类迭代器都必须在内部对HashMap
所有键进行排序,以便能够按排序顺序对其进行迭代。 使用已经排序的Map
实现会更有效率。
您可以使用TreeMap,因为它是排序的地图。
使用Java 8,这非常简单:
import static java.util.Map.Entry.comparingByKey;
public <K extends Comparable<? super K>, V> Iterator<V> orderedIterator(final Map<K, V> map) {
return map.entrySet().stream()
.sorted(comparingByKey())
.map(Map.Entry::getValue)
.iterator();
}
注意,这很慢 ,因为需要每次对Stream
进行排序-因此迭代变为O(n lg n)
而不是O(n)
。 如果您需要大量执行此操作,则最好使用TreeMap
插入为O(lg n)
(而不是O(1)
),但迭代仍然为O(n)
。
我不确定这是完全可能的,至少从映射的角度来看,尽管我们可以创建一个特殊的哈希映射,但返回键是排序顺序。
该映射可以扩展HashMap
并具有一个包含排序顺序的变量,然后具有一个按排序顺序返回键和值的方法。
您可能有一个静态实用程序方法,该方法采用HashMap
并以排序顺序返回Map.Entry
的数组。
尽管上述方法可能有效,但TreeMap
可能是可行的方法。 它是为该任务而设计的,由Josh Blotch编写,因此它一定会很快地完成它的工作。 重新发明轮子总是需要更长的时间,而且效果也不佳。
注意:这取决于用例。 如果只需要使用排序的值一次,那么最好使用实用程序方法或自定义HashMap
实现。 如果您打算经常使用Map
,请使用TreeMap
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.