java - 如何从 Java 中的 HashMap 中选择一个随机键?

标签 java random hashmap

我正在使用大型 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/

相关文章:

c - 哈希索引与数组大小有何关系?

vector - 如何将向量映射到 map ,并将重复的键值插入其中?

java - 字符串过滤..任何一个..仅包含所选字符之一或两者

java - 如何在jsp上访问名为 "get"的对象方法以避免使用scriplet?

python - 元组的 Numpy 随机选择

javascript - 在 Javascript 中使用枚举的值作为另一个枚举的键

java - actionbarshearlock Activity 中的透明操作栏

java - Struts 1.x Action 类 ThreadSafe?

java - 如何检查数组的随机部分是否等于特定数组部分?

c# - 使用 LINQ 从列表中随机选择一个匹配的字符串