在没有循环的情况下随机获取HashMap或HashSet中的元素

The*_*eLQ 8 java collections hashmap hashset

我有大约420,000个元素需要存储在某种Set或List中.但是限制是我需要能够选择一个随机元素并且需要快速.

最初我使用了ArrayList和LinkedList,但是有很多元素它很慢.当我对它进行分析时,我看到equals()我存储的对象中的方法在很短的时间内被称为大约2100万次.

接下来我尝试了一个HashSet.我在性能方面获得的东西我在功能上松了一口气:我不能选择随机元素.HashSet由HashMap支持,HashMap由一组HashMap.Entry对象支持.然而,当我试图暴露它们时,我被整个Java Collections Framework的疯狂私有和包私有可见性所阻碍(即使复制和粘贴类也不起作用,JCF非常"使用我们拥有的东西或滚动你自己的东西").

随机选择存储在HashSet或HashMap中的元素的最佳方法是什么?由于集合的大小,我宁愿不使用循环.

重要编辑:我忘记了一个非常重要的细节:我究竟是如何使用Collection的.我在桌子的乞讨处填充整个收藏品.在程序中,我选择并删除一个随机元素,然后选择并删除一些更多的已知元素,然后重复.不断查找和更改是导致缓慢的原因

Jon*_*eet 4

没有理由为什么 anArrayList或 aLinkedList需要调用equals()...尽管您想要 aLinkedList这里,因为您希望通过索引快速随机访问。

AnArrayList应该是理想的 - 创建一个适当的容量,将所有项目添加到其中,然后您可以重复选择适当范围内的随机数,并调用get(index)以获取相关值。

HashMap并且HashSet根本不适合这个。

  • @TheLQ:但是为什么你需要删除该元素,为什么你需要“contains”?当听起来我们只听到了您大约三分之一的要求时,很难回答这个问题...... (2认同)