我想检查是否仅在2D数组的行中存在重复并替换它。
所以,如果数组是:
7, 5, 6, 1, 7, 5, 7, 1 // would change the 7 in [4] and [6]
2, 4, 3, -1, 7, 5, 8, 3 // would change the 3 in [7]
8, 7, 2, -3, 7, 1, 5, 1
5, 7, 3, 2, 4, 5, -4, 8
6, 1, 8, 2, 2, 6, 1, 3
int row = 0;
if (row < zipcodelist.length) {
for (int z = 0; z < zipcodelist[row].length; z++) {
for (int y = 1; y < zipcodelist[row].length; y++) {
if (zipcodelist[row][z] == zipcodelist[row][y]) {
zipcodelist[row][y] = 1 + generator2.nextInt(8);
} else if (zipcodelist[row][z] != zipcodelist[row][y]) {
System.out.println("Not duplicate");
}
}
}
row++;
}
但是使用这段代码,一切都会改变,而不仅仅是重复。我做错了什么?
答案 0 :(得分:1)
您应该从第二次迭代中的行中的下一个元素开始,而不是列表中的第二个元素
所以
for(int y = 1; y<zipcodelist[row].length; y++){
应替换为
for(int y = z + 1; y<zipcodelist[row].length; y++){
希望这有帮助。
答案 1 :(得分:1)
作为替代方案,您可以使用HashSet。您当前的嵌套循环为O(n ^ 2)。
int [] array = {7,5,6,1,7,5,7,1};
Set alreadyExamined = new HashSet();
for(int i=0; i<array.length; i++){
if(alreadyExamined.contains(array[i])){
array[i] = new Random().nextInt(8)+1;
}
else{
alreadyExamined.add(array[i]);
}
}
注意:如果您的目标是删除重复项,那么新生成的号码可能是前一个号码的另一个副本。
答案 2 :(得分:0)
但是如果你在第一次迭代中删除重复,如下,
7,5,6,1, 7 ,5,7,1
7,5,6,1, 6 ,5, 5 ,1
然后下一次迭代可以再次重复,如下面,
7, 5 ,6,1,6,5,5,1
7, 5 ,6,1,6, 8 , 7 ,1
因此我认为这种随机数字的发明者不适合这种情况。