有人可以解释为什么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]);
}
}
}
}
目前,这是我所能得到的最好的结果,但是代码排除了相等的元素,即使它们是唯一的元素也是如此。
答案 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;
}
}
}
}