我知道HashMap沒有排序,但是有任何東西我可以創建迭代器,它按鍵的排序順序返回值。我可以使用排序版本的集合,但我正在尋找一種方法來使用基於哈希的地圖。對HashMap進行排序迭代Java
回答
您可以使用TreeMap,因爲它是一個有排序的地圖。
任何這樣的迭代器都必須在內部對HashMap
的所有鍵進行排序,以便能夠按排序順序對它們進行迭代。使用已經排序的Map
實施會更有效率。
與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
。
取決於。如果你只需要做一次;那麼對'entrySet'進行排序的代價將小於維護'TreeMap'的成本。 'TreeMap'與'HashMap'相比非常慢 - 它也需要更多的空間。你的最後一段真的取決於用例 - 它需要基準來確定哪種方法更好。 –
@Boris the Spider我假設操作系統想要使用經過排序的'HashMap'實現,或者使用簡單的實用程序方法。儘管我會更新答案以反映這一點。 –
- 1. 在Java(或Scala)中對HashMap的HashMap進行迭代
- 2. 在Java中使用HashMap進行迭代
- 3. Java迭代:Hashtable對HashMap
- 4. 在java中對一個通用的hashmap進行迭代
- 5. Java HashMap迭代器
- 6. 根據Value對Key進行排序HashMap?
- 7. 如何在Java中對HashMap進行排序?
- 8. 迭代Java合併排序
- 9. 如何通過Python中的已排序迭代進行迭代
- 10. 對Java中的ListStore進行迭代Gxt
- 11. 在Scala中對已排序集的反向進行迭代?
- 12. 通過已排序集合進行成對迭代的習語
- 13. Java - 用HashMap替代ArrayList的迭代
- 14. 當值爲對象時,按屬性對hashMap進行排序
- 15. 對其屬性的HashMap對象進行排序而不是值
- 16. 在HashMap的HashMap上迭代
- 17. 對PowerShell進行迭代$ input
- 18. 對字典進行迭代
- 19. 在java代碼中進行堆排序?
- 20. Java的HashMap的排序
- 21. Java PriorityList,如何對它進行排序?
- 22. Java如何對multimap進行排序vs?
- 23. 在Java中對ArrayList進行排序
- 24. 在java中對JSONArray進行排序
- 25. 使用Java對數組進行排序
- 26. 用Java對HashTables的ArrayList進行排序
- 27. 用Java對鏈表進行排序
- 28. 用Java對XML進行排序
- 29. Java-8對集合進行排序
- 30. Java - 對2D數組進行排序
是的我可以,我正在尋找一種方法來使用HashMap來做同樣的事情 – Avinash