2016-11-16 68 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)。