2016-11-16 31 views
0

我想测试多维数组以查看是否包含任何重复值。如果是这样,我希望该方法返回false。否则,我希望它返回true。Java - 多维数组如何测试所有唯一值的数组

这是我目前的代码。我的逻辑错在哪里?

public static boolean isUnique(int[][] array2, int num) { 

    for (int i = 0; i < array2.length - 1; i++) { 
     for (int j = i + 1; j < array2.length; j++) { 
      if (array2[i] == array2[j]) { 
       return false; 
      } 
     } 
    } 
    return true; 
} 
+0

为什么你认为你的逻辑错了?你看到的是什么问题/错误? – nbrooks

+0

@nbrooks在我的程序中运行该方法时,它将允许像{0,0,0} {0,0,0} {0,0,0}这样的数组通过 –

+0

因此,通过“重复值”,你的意思是不要不希望任何内部数组(行)是相同的?所以'{{0,0 0},{0,0 0}}'是坏的,但是{{0,0 0,0,0,1}}'可以吗? – nbrooks

回答

0

您当前实施检查两行是否相同(这是一个基于参考检查,而不是一个值。)这意味着它会询问“是否array2[i]array2[j]在内存中的同一个地址,而不是他们是否包含相同的东西。

如果您想查看行是否为唯一您可以使用array2[i].equals(array2[j])而不是array2[i] == array2[j]

如果你想检查独特的元素(array[i][j] != array2[i+m][j+n]哪里!(M ==ñ== 0)),你就需要通过这两个级别的

for (int i = 0; i < array2.length; i++) { 
    for (int j = 0; j < array2[i].length; j++) { 
     // compare array2[i][j] to all other array2[m][n] here. 
    } 
} 
1

遍历现在你的代码是检查是否阵列里面的array2是相同的。 array2[i]array2[j]都是指数组,因为array2是一个数组数组。

相反,你想看看每个数组内的值。既然你想在网格中的任何地方重复任何值,你就会有效地将结构压扁成一个集合,并检查重复。

A HashSet是在这种情况下使用的最佳数据结构。逐行遍历整个网格,为您的新结构添加值。如果遇到重复,返回false

public static boolean isUnique(int[][] array2) { 
    Set<Integer> values = new HashSet<>(); 

    for (int i = 0; i < array2.length; i++) { 
     for (int j = 0; j < array2[i].length; j++) { 
      if (!values.add(array2[i][j])) { 
       return false; 
      } 
     } 
    } 

    return true; 
} 

有些东西这里要注意:

  • 设定的add method如果试图重复添加到集合,所以这是包裹在将返回false一个if声明一个简单的,快速失败的停止条件。

  • 每个内部数组的大小与外部数组的大小完全无关,所以您仍然希望从0循环到数组的长度(当您使用<时,您不需要需要length - 1)。