【问题标题】:Avoid inserting duplicate value to a list in Java避免在 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++;
    }
}

【问题讨论】:

  • 改用集合。

标签: java list duplicates


【解决方案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有什么原因吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      相关资源
      最近更新 更多