【发布时间】:2016-12-11 19:18:16
【问题描述】:
我需要保留一个唯一的元素列表,并且我还需要不时从它们中随机选择一个。我有两种简单的方法可以做到这一点。
-
让元素出现在一个集合中——这让我拥有了元素的独特性。当需要随机选择一个时,请执行以下操作:
elementsSeen.toArray()[random.nextInt(elementsSeen.size())] -
保留在列表中看到的元素 - 这样不需要转换为数组,因为当我需要随机请求时,有 get() 函数。但是这里我需要在添加时这样做。
if (elementsSeen.indexOf(element)==-1) {elementsSeen.add(element);}
所以我的问题是哪种方式更有效?转换为数组更消耗还是 indexOf 更糟?如果尝试添加元素的次数增加了 10 次、100 次或 1000 次怎么办?
我对如何以最高效的方式将列表的功能(按索引访问)与集合的功能(唯一添加)结合起来很感兴趣。
【问题讨论】:
-
你为什么不同时使用呢?无需创建额外的对象,因为两个集合可以指向同一个。
-
您会经常查找它们吗?然后使用列表。你会插入很多吗?然后使用一个集合。我绝对不喜欢选项 1,但我也不完全确定你需要使用它。无论如何,集合通常会以不确定的顺序返回内容,因此您可以获取任何元素。
set.iterator().next();或保留迭代器的引用并在需要随机元素时调用.next()。后者应该是随机的,尽管你不会得到重复。或者int i = random.nextInt(set.size()); for (Object o : set) { if (i-- == 0) return o;)- 内存比数组少。 -
因此,您根本不需要列表。你只是认为你需要一个列表,因为你想要一个随机选择。
-
我的问题实际上并不是从集合中获取随机数,而是关于如何有效地结合集合和列表的特征。随机在这里更像是一个比喻,我真正想要的列表方面是按索引访问。
标签: java performance list set