2016-02-28 127 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'實現,或者使用簡單的實用程序方法。儘管我會更新答案以反映這一點。 –