在java中仅检查2d数组的行中的重复项

时间:2014-03-02 04:57:03

标签: java

我想检查是否仅在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++;
} 

但是使用这段代码,一切都会改变,而不仅仅是重复。我做错了什么?

3 个答案:

答案 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

因此我认为这种随机数字的发明者不适合这种情况。