避免在 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++;
        

    

【讨论】:

containsList 上是 O(n) - 这使得该算法的效率非常低下 O(n^2)。请改用LinkedHashSet 你不使用java.util.Set有什么原因吗?

以上是关于避免在 Java 中的列表中插入重复值的主要内容,如果未能解决你的问题,请参考以下文章

MySQL5.7新增数据避免重复记录

如何避免在 SQL Server 中重复插入动态值

避免雪花中存储过程的重复

JAVA中列表,集合之间的区别

如何避免在回发时从 asp.net 重复输入?

在JAVA连接的数据库中插入数据时如何避免重复信息~