我有一个 HashMap,每次获得迭代器时,我想以不同的随机顺序迭代它们的键值对。从概念上讲,我想在调用迭代器之前“洗牌”地图(或者如果您愿意,“洗牌”迭代器)。
我看到有两个选择:
1)使用 LinkedHashMap 的方法并在内部保留条目列表,将其就地打乱并在调用迭代器时返回该视图。
2)采用map.entrySet(),构造一个ArrayList并对其使用shuffle()。
虽然这两种方法对我来说看起来非常相似,但我期待非常大的 HashMap,所以我真的很关心细节和内部结构,因为我真的不能浪费内存或计算。
重新洗牌一个大的收藏总是会很昂贵。每个条目至少需要一份参考资料。例如对于 100 万个条目,您将需要大约 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) { /* ... */ }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)