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