我知道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