2016-11-16 5 views
0

Ich versuche, ein mehrdimensionales Array zu testen, um festzustellen, ob doppelte Werte enthalten sind. Wenn dies der Fall ist, möchte ich, dass die Methode false zurückgibt. Sonst möchte ich, dass es wahr wird.Java - Multidimensional Arrays Testen eines Arrays für alle eindeutigen Werte

Hier ist mein aktueller Code. Wo ist meine Logik falsch?

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

Warum denken Sie, Ihre Logik ist falsch? Was ist das Problem/der Fehler, den Sie sehen? – nbrooks

+0

@nbrooks Wenn ich die Methode in meinem Programm starte, wird es Arrays wie {0,0,0} {0,0,0} {0,0,0} erlauben –

+0

zu passieren. Also unter "Duplicate values" meinst du du don Möchte keiner der inneren Arrays (Zeilen) gleich sein? Also ist {{0, 0, 0}, {0, 0, 0}} 'schlecht, aber' {{0, 0, 0}, {0, 0, 1}} 'ist ok? – nbrooks

Antwort

0

Ihre aktuelle Implementierung ist die Überprüfung, ob zwei Reihen gleich sind (dies ist eine Referenz basierte Prüfung, sondern als ein Wert.) Das bedeutet, dass es fragt: ‚Ist array2[i] und array2[j] die gleiche Adresse im Speicher, anstatt enthalten sie die gleichen Dinge.

Wenn Sie sehen möchten, ob die Zeilen einzigartige sind würden Sie array2[i].equals(array2[j]) anstelle von array2[i] == array2[j].

Wenn Sie einzigartige Elemente (array[i][j] != array2[i+m][j+n] wo! (M == n == 0)) würden Sie müssen durchlaufen beide Ebenen in einem

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

Gerade jetzt Ihren Code überprüfen wollte Überprüfung wird ob eines der Arrays innerhalb array2 sind die gleichen. array2[i] und array2[j] beziehen sich beide auf Arrays, weil array2 ein Array von Arrays ist.

Stattdessen möchten Sie die Werte in jedem dieser Arrays betrachten. Da Sie bei einem wiederholten Wert an einer beliebigen Stelle im Grid fehlschlagen möchten, versuchen Sie effektiv, die Struktur in eine Sammlung zu reduzieren und nach Duplikaten zu suchen.

Eine HashSet ist die beste Datenstruktur in diesem Fall zu verwenden. Durchqueren Sie das gesamte Raster, Zeile für Zeile, und fügen Sie Werte in Ihre neue Struktur ein. Wenn Sie ein Duplikat stoßen, kehren 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; 
} 

Einige Dinge zu beachten:

  • Das Set add method wird falsch zurück, wenn Sie ein Duplikat der Sammlung hinzuzufügen versuchen, so dass gewickelt ist in eine if Anweisung für eine einfache, Fail-Fast-Stop-Bedingung.

  • Die Größen von jedem des inneren Arrays von der Größe der äußeren Anordnung völlig unabhängig sind, so dass Sie immer noch wollen Schleife von 0 auf die Länge des Arrays (wenn Sie < verwenden, nicht wahr brauche die length - 1).

Verwandte Themen