我有一个 HashMap。
它有数百个数百万的观察结果。
按键的数字顺序迭代 HashMap 元素的最佳方法是什么?
我考虑过改成TreeMap,但没有这样做,因为这实际上可能会增加创建Map的负载(因为TreeMap是O(n),HashMap是O(1))。
使用 Java 8,您可以使用类似于以下内容的内容:
import static java.util.Comparator.comparing;
map.entrySet().stream()
.sorted(comparing(Entry::getKey))
.forEach(e -> doSomethingWithTheEntry(e));
这显然会涉及对未排序的键进行排序,这是有代价的。因此,您需要决定是否要使用 TreeMap 预先支付费用,还是在需要时继续使用 HashMap。
如果您的插入顺序与键的顺序相同,那么您可以使用LinkedHashMap。
Map接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与 HashMap 的不同之处在于,它维护一个贯穿其所有条目的双向链表。该链表定义了迭代顺序,通常是将键插入到映射中的顺序(插入顺序)。请注意,如果将键重新插入到映射中,插入顺序不会受到影响。 (如果在 m.containsKey(k) 在调用之前立即返回 true 时调用 m.put(k, v),则密钥 k 会重新插入到映射 m 中。)
您无法按顺序(例如键的数字顺序)迭代
HashMap
。您遇到 HashMap
的键/值/条目的迭代顺序取决于实现,不应依赖。
您可以使用
TreeMap
来表示所需的迭代顺序。如果您使用 LinkedHashMap
,您可以按照将键插入 Map
的顺序进行迭代,但这仍然不是您想要的(除非您按数字顺序插入键)。