2016-02-28 119 views
0

我知道HashMap没有排序,但是有任何东西我可以创建迭代器,它按键的排序顺序返回值。我可以使用排序版本的集合,但我正在寻找一种方法来使用基于哈希的地图。对HashMap进行排序迭代Java

回答

0

您可以使用TreeMap,因为它是一个有排序的地图。

+0

是的我可以,我正在寻找一种方法来使用HashMap来做同样的事情 – Avinash

3

任何这样的迭代器都必须在内部对HashMap的所有键进行排序,以便能够按排序顺序对它们进行迭代。使用已经排序的Map实施会更有效率。

0

与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)

0

我不确定这是完全可能的,至少从地图的角度来看,虽然我们可以创建一个特殊的哈希映射从排序顺序返回键。

该地图可以延伸HashMap并且有一个变量,它包含排序顺序,然后有一个方法以排序顺序返回键和值。

您可以使用一个静态实用程序方法,它按排序顺序执行HashMap并返回一个Map.Entry的数组。

虽然上面的工作可能会起作用,但TreeMap可能是最好的选择。它是为这项任务设计的,由Josh Blotch编写,所以它的功能必然很快。重新磨轮通常需要更长的时间,并且不能很好地工作。

注意:这取决于用例。如果您只需要使用一次排序值,那么实用方法或自定义HashMap实施将是最好的。如果您打算经常使用Map,那么请使用TreeMap

+0

取决于。如果你只需要做一次;那么对'entrySet'进行排序的代价将小于维护'TreeMap'的成本。 'TreeMap'与'HashMap'相比非常慢 - 它也需要更多的空间。你的最后一段真的取决于用例 - 它需要基准来确定哪种方法更好。 –

+0

@Boris the Spider我假设操作系统想要使用经过排序的'HashMap'实现,或者使用简单的实用程序方法。尽管我会更新答案以反映这一点。 –

相关问题