避免在 Java 中的列表中插入重复值
Posted
技术标签:
【中文标题】避免在 Java 中的列表中插入重复值【英文标题】:Avoid inserting duplicate value to a list in Java 【发布时间】:2022-01-08 16:01:24 【问题描述】:所以我想将随机整数插入到列表中。但是,我想确保列表中没有重复项。这是我到目前为止所做的:
while (options.size() <=4)
int i = 0;
int random = ThreadLocalRandom.current().nextInt(answer - 8 ,answer + 8);
if (random != answer && random != options.get(i-1))
options.add(random);
i++;
【问题讨论】:
改用集合。 【参考方案1】:最简单的方法是使用不同的随机流:
ThreadLocalRandom.current()
.ints(answer - 8, answer + 8)
.distinct()
.limit(5)
.forEach(options::add);
为了在更大的数据集上获得更好的性能,您可以改用 shuffle:
List<Integer> range = IntStream.range(answer - 8, answer + 8)
.boxed()
.collect(Collectors.toCollection(ArrayList::new));
Collections.shuffle(range);
options.addAll(range.subList(0, 5));
【讨论】:
【参考方案2】:由于您希望集合中有不同的值,请使用 LinkedHashSet 并在其中添加值。
Set<Integer> options = new LinkedHashSet<>();
while (options.size() <= 4)
int i = 0;
int random = ThreadLocalRandom.current().nextInt(answer-8, answer+8);
if (random != answer)
options.add(random);
i++;
完成后,您可以将集合转换为列表(如果需要进一步处理)
List<Integer> list = set.stream().collect(Collectors.toList());
【讨论】:
【参考方案3】:原来我只需要包含函数
while (options.size() <=4)
int i = 0;
int random = ThreadLocalRandom.current().nextInt(answer -8 ,answer +8 );
if (random != answer && !options.contains(random))
options.add(random);
i++;
【讨论】:
contains
在 List
上是 O(n)
- 这使得该算法的效率非常低下 O(n^2)
。请改用LinkedHashSet
。
你不使用java.util.Set有什么原因吗?以上是关于避免在 Java 中的列表中插入重复值的主要内容,如果未能解决你的问题,请参考以下文章