我正在使用大型 ArrayList<HashMap<A,B>>
,我会反复需要从随机 HashMap 中选择一个随机键(并用它做一些事情)。选择随机 HashMap 很简单,但我应该如何从这个 HashMap 中选择一个随机键?
速度很重要(因为我需要这样做 10000 次并且 HashMap 很大),所以只需在 [0,9999] 中选择一个随机数 k 然后执行 .next()
在迭代器上 k 次,真的不是一个选项。 同样,在每次随机选择时将 HashMap 转换为数组或 ArrayList 确实不是一种选择。请在回复之前阅读此内容。
从技术上讲,我认为这应该是可能的,因为 HashMap 将其键存储在 Entry[]
中。在内部,从数组中随机选择很容易,但我不知道如何访问这个 Entry[]
.所以任何访问内部的想法Entry[]
非常欢迎。当然也欢迎其他解决方案(只要它们不消耗散列图大小的线性时间)。
注意:启发式方法很好,所以如果有一种方法可以排除 1% 的元素(例如,因为有多个填充的桶),那完全没有问题。
最佳答案
从我的头顶
List<A> keysAsArray = new ArrayList<A>(map.keySet())
Random r = new Random()
然后就
map.get(keysAsArray.get(r.nextInt(keysAsArray.size()))
关于java - 如何从 Java 中的 HashMap 中选择一个随机键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12385284/