HashMap:以随机顺序迭代键值对

问题描述

改组大型收藏总是很昂贵的。每个条目至少需要一个参考。例如,对于一百万个条目,您将需要大约4 MB。

注意; 随机播放操作是O(N)

我会用

Map<K,V> map = 
List<Map.Entry<K,V>> list = new ArrayList<Map.Entry<K,V>>(map.entrySet());

// each time you want a different order.
Collections.shuffle(list);
for(Map.Entry<K, V> entry: list) { /* ... */ }

解决方法

我有一个HashMap,每次我获得迭代器时,我都希望以不同的随机顺序迭代它们的键值对。从概念上讲,我想在调用迭代器之前对地图进行“混洗”(或者,如果需要,可以对迭代器进行“混洗”)。

我有两种选择:

1)使用LinkedHashMap的方法,并在内部保留条目列表,将其随机洗净,并在调用迭代器时返回该视图。
2)使用map.entrySet(),构造一个ArrayList并在其上使用shuffle()。

虽然这两种方法看起来很像我,但我期待的是非常大的HashMaps,所以我真的很关注细节和内部结构,因为我实在无法浪费内存或计算。