【问题标题】:How to check, remove and replace duplicate values inside an Array List?如何检查、删除和替换数组列表中的重复值?
【发布时间】:2020-11-25 22:42:42
【问题描述】:

我想生成 5 个随机数,如果该数字已经存在,请将其删除并替换为新的。重复该过程,直到生成的所有数字都是唯一的。但是,当我不断在我的数组中获取重复值时,我被卡住了。

import java.util.Random;
import java.util.ArrayList;

public class Question2_NEW
{
    public static void main (String[] args)
    {
        System.out.println("Generating 5 random numbers from 0 to 5...");

        Random rand = new Random();
        int generate = rand.nextInt((5) + 1);
        ArrayList<Integer> randomNumbers = new ArrayList<Integer>();
        
        for (int i = 0; i < 5; i++)
        {
            generate = rand.nextInt((5) + 1);
            randomNumbers.add(generate);

            while (randomNumbers.contains(generate)) 
            {
                randomNumbers.remove(randomNumbers.get(i));
                generate = rand.nextInt((5) + 1);
                randomNumbers.add(generate);
                break;
            }
        }

        for (Integer i : randomNumbers) 
        {
            System.out.println(i);
        }
    }
}

【问题讨论】:

  • 为什么不直接使用 Set 而不是 List?一个 Set 不能有重复的值。您只需要添加值,直到您的集合大小为 5。
  • 是的,你是对的。使用 Set 而不是 ArrayList 以避免重复时,我不知道该功能。感谢您指出这一点。

标签: java arrays loops arraylist random


【解决方案1】:

发生这种情况是因为在while 循环中,您没有检查替换号码是否已经在ArrayList 中。它被毫无疑问地接受了。

更好的解决方案是在添加之前检查号码是否有效

    for (int i = 0; i < 5; i++)
    {
        generate = rand.nextInt((5) + 1);
        while (randomNumbers.contains(generate)) 
        {
            generate = rand.nextInt((5) + 1);
        }
        randomNumbers.add(generate);
    }

请注意,此任务有更高效的算法。一方面,使用HashSet 可以更快地检查成员资格。另一方面,如果您只想生成数字 1 到 N 的随机排列,Fisher-Yates shuffle 是无可争议的最佳解决方案。对于像 5 个数字这样的小数字,它可能并不重要。

【讨论】:

    【解决方案2】:

    在您的代码中编写并调用此方法。

    private boolean arrayListIncludes(Integer i, ArrayList<Integer> randomNumbers) {
        for(int x = 0; x<randomNumbers.size(); x++) {
             if(randomNumbers.get(i).intValue() == i.intValue()) {
                   return true;
             }
        }
        return false;
    }
          
    

    【讨论】:

      【解决方案3】:

      如果你想使用 List 我会:

          public static void main(String[] args) {
              System.out.println("Generating 5 random numbers from 0 to 5...");
      
              Random rand = new Random();
              int generate;
              List<Integer> randomNumbers = new ArrayList<Integer>();
      
              for (int i = 0; i <= 5; i++) {
                  do {
                      generate = rand.nextInt((5) + 1);
                  } while (randomNumbers.contains(generate));
      
                  randomNumbers.add(generate);
              }
      
              for (Integer i : randomNumbers) {
                  System.out.println(i);
              }
          }
      

      如果你也可以使用集合:

          public static void main(String[] args) {
              System.out.println("Generating 5 random numbers from 0 to 5...");
      
              Random rand = new Random();
              Set<Integer> randomNumbers = new HashSet<Integer>();
      
              while (randomNumbers.size() <= 5) {
                  randomNumbers.add(rand.nextInt((5) + 1));
              }
      
              for (Integer i : randomNumbers) {
                  System.out.println(i);
              }
          }
      

      编辑:解决了 Set/ArrayList 长度的问题

      【讨论】:

        猜你喜欢
        • 2019-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-06
        • 1970-01-01
        • 2020-03-28
        • 2021-01-11
        相关资源
        最近更新 更多