检查数组是否有重复项

时间:2012-02-06 19:53:14

标签: java arrays duplicates

此方法是否检查并替换数组中的random?

public void generateNumbers()
   {

       for(int counter=0; counter< 6; counter++){

           numbers[counter]= 1+ (int)(Math.random()*49);
           for(int y = counter - 1; y >=0 ; y--){
               if(numbers[counter] == numbers[y]){
                   numbers[counter]= 1+ (int)(Math.random()*49);
                }
           }


    }

如果有重复项,我需要用另一个随机数替换它,然后再次检查。我希望尽可能使用循环来检查这个,而不是使用集合。

随机创建的数字范围应为1 - 49。

2 个答案:

答案 0 :(得分:1)

对于这些问题,通常有更好的算法。您的示例是对抽奖进行建模,可以将其描述为:从一堆m个元素中抽取n个元素。在你的情况下,n:= 6; m:=从1到49的数字 - 但你可以根据需要进行调整(甚至在桶中有多个相似的元素)。

因此,解决这个问题的更好方法是:

  1. 创建一个基本列表,其中包含绘制前可用的所有项目,即包含数字的列表1..49

  2. 创建一个空结果列表

  3. 循环迭代n次,执行以下操作:

    1. 在0和最大项目数之间选择列表的随机索引(仍然存在于列表中)

    2. 从基本列表中取出3.1中索引处的项目,并将其添加到结果中

    3. 从基本列表中删除索引处的项目。这可确保在结果中第二次不会出现相同的数字。因此,下次执行步骤3.1时,基本列表中的最大项目数将减少1个。

  4. 我不会详细介绍如何用Java编写所述算法,因为它的味道很像家庭作业。

答案 1 :(得分:0)

您需要在找到重复内容时“快退”回counter-1,以便您再次开始搜索重复内容:

public void generateNumbers()
{

   for(int counter=0; counter< 6; counter++){

       numbers[counter]= 1+ (int)(Math.random()*49);
       for(int y = counter - 1; y >=0 ; y--){
           if(numbers[counter] == numbers[y]){
               numbers[counter]= 1+ (int)(Math.random()*49);
               y = counter - 1; // <<<===== ADDED
            }
       }


}

如果从这个数组开始,原始方法将失败

1 3 7 8

然后生成3,对8和7检查,找到重复3,并生成8作为替换。此时,您的算法将检查8对1,并确信没有重复;这是不正确的。