繁体   English   中英

HashMap Java的排序迭代

[英]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.

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