查找包含100个随机元素的数组是否包含数字,这不重复吗?

时间:2019-01-02 18:43:23

标签: java arrays

有人可以解释为什么System.out.println("Doesn't repeat: "+a[i]);不打印任何内容吗?

import java.util.Arrays;
import java.util.Random;




public class Practice {


public static void main(String[] args) {
    int []a=new int[100];

    Random rand =new Random();
        for(int i=0;i<100;i++)
           {
        a[i]=rand.nextInt((100-1)+1)+1;

           }
    Arrays.sort(a);
        for(int i=0;i<100;i++)
           {
        System.out.print(a[i]+ " ");

           }
boolean flag;
    System.out.print(" ");
    System.out.print(" ");
    for(int i=0;i<100;i++)
    {
        flag=false;
        for(int j=0;j<100;j++) 
        {
            if(a[i]==a[j])
            {
            flag=true;
            break;
            }
        }
        if(flag==false)
        {
            System.out.println("Doesn't repeat: "+a[i]);
        }
    }       
}
}

我只得到当前包含100个元素的数组,并且没有出现两次或两次以上的元素的行不显示。

编辑:

import java.util.Arrays;
import java.util.Random;




public class Practice {


    public static void main(String[] args) {
        int []a=new int[100];

        Random rand =new Random();
        for(int i=0;i<100;i++)
        {
            a[i]=rand.nextInt((100-1)+1)+1;

        }
        Arrays.sort(a);
        for(int i=0;i<100;i++)
        {
            System.out.print(a[i]+ " ");

        }
    boolean flag;
        System.out.print(" ");
        System.out.print(" ");
        for(int i=0;i<100;i++)
        {
            flag=false;
            for(int j=0;j<100;j++) 
            {

             if (i==j) {
                    continue;
                }
             else if(a[i]==a[j])
                {
                flag=true;
                break;
                }

            }
            if(flag==false)
            {
                System.out.println("Doesn't repeat: "+a[i]);
            }
        }

    }
}

目前,这是我所能得到的最好的结果,但是代码排除了相等的元素,即使它们是唯一的元素也是如此。

4 个答案:

答案 0 :(得分:2)

您始终会根据自己的位置检查重复项。每次嵌套循环迭代i将等于j,您将发现一个“重复项”。当前代码最简单的解决方法是测试i是否不等于j

此外,因为您已经对数组进行了排序,所以任何重复项都可以在连续位置找到。您只需要扫描阵列一次,而不是扫描100次,即可找到重复项。只需存储先前的值即可,以便您可以查看当前元素是否重复。

您应该获得许多不是重复的元素,但不是全部。在填充最后一个(第100个)随机元素时,即使先前选择的所有99个整数都是唯一的,选择唯一未选择的整数以防止重复的机会只有100的几分之一。在此之前,在第99个随机元素上,从100个中选择2个未选择的整数之一以防止重复的机会只有2个,以此类推。如果确实为所有元素都打印了一条线,那么您应该玩彩票了。

如果您需要所有唯一元素,请initialize the values sequentially, then shuffle them

答案 1 :(得分:1)

更改

for (int j = 0; j < 100; j++) // ends up comparing a number with itself as well

 for (int j = i+1; j < 100; j++) // compares with the rest of the elements ahead of it

答案 2 :(得分:1)

由于已经在对数组进行排序,因此需要检查resolveWithFullResponse中的重复元素 而且,在您有多个重复元素的情况下,您需要使用while循环作为跳过这些元素

i+1(i.e, j)

代码如下

                    while(j<100 && a[i] == a[j]) { // skip all repeating items
                        j++;
                    }
                    i=j-1;

答案 3 :(得分:1)

我对您的代码进行了一些更改(删除了flag并使用了unique,因为它更具可读性)。
我还向包含非唯一项目的最后一个索引添加了一个修改i的内部循环:

boolean unique;
System.out.println();
for (int i = 0; i < 100; i++) {
    unique = true;
    for (int j = i + 1; j < 100; j++) {
        if (a[i] == a[j]) {
            unique = false;
            break;
        }
    }
    if (unique) {
        System.out.println("Doesn't repeat: " + a[i]);
    } else {
        for (int k = i + 1; k < 100; k++) {
            if (a[k] != a[i]) {
                i = k - 1;
                break;
            }
        }
    }
}