2016-06-26 8 views
3

Ich bin ziemlich neu in Java, also bitte ertragen Sie mit mir. Ich schrieb dieses Programm:Die Methode gibt true zurück, obwohl dies nicht der Fall ist. Mögliche Komplikation mit for-Schleife

public static void main(String args[]) 
{ 
    int[] list = {1, 1, 2, 2, 3, 4, 5, 6, 7, 8, 10}; 
    isUnique(list); 
    System.out.println(isUnique(list)); 

} 

private static boolean isUnique(int[] array) 
{ 
    int count = 0; 

    for (int n : array) 
    { 
     for (int i = 0; i < array.length; i++) 
     { 
      if (n == array[i]) 
      { 
       count++; 
      } 
      if (count > 1) 
      { 
       return false; 
      } 
      else 
      { 
       return true; 
      } 
     } 
    } 
    return false; 
} 

}

es angenommen hat, um das Array zu überprüfen und sehen, wenn es mehr ist als 1 jede Zahl. Es scheint jedoch nicht zu funktionieren. Es gibt True zurück, auch wenn es zwei Einsen gibt. Irgendwelche Ideen? Ich vermute, dass die for-Schleife nicht funktioniert, aber ich bin nicht ganz sicher warum.

Vielen Dank im Voraus!

+0

Ist das Problem deutlicher, wenn Sie die zweite umschreiben bedingt äquivalent als 'return count <= 1;'? –

Antwort

2

Es true egal zurück, was, weil Sie, dass else Block hat. Da count Null startet und es maximal eine Zeit pro Schleife erhöht, wird else Block immer ausführen (wenn die Array-Länge nicht 0 ist). Sie können als zwei Fälle daran denken:

Fall 1. n == array[i] ->count>1 ist nicht wahr - -> else-Block läuft und liefert true> count gleich 1 wird.

Fall 2. n ist nicht array[i] -> count gleich 0 -> zählen >1nicht wahr ist -> else-Block läuft und gibt true zurück

+0

@AndyTurner schöner Fang. – intboolstring

1

Der Code gibt true zurück, nachdem das erste Element überprüft, da nach dem ersten Element Überprüfung count == 1, so dass Ihre else-Anweisung ausgeführt wird:

 if (count > 1) 
     { 
      return false; 
     } 
     else 
     { 
      return true; 
     } 

Sie nur true nach Überprüfung aller Elemente im Array zurückgeben sollte und keine Duplikate finden.

Wenn das Eingabearray sortiert ist, benötigen Sie keine verschachtelte Schleife, um festzustellen, ob zwei aufeinanderfolgende gleiche Zahlen vorhanden sind. Eine einzelne Schleife reicht aus.

Wenn das Array nicht sortiert ist, müssen Sie eine Anzahl für die Anzahl der Vorkommen jedes im Array gefundenen Werts verwalten, wobei HashMap verwendet werden kann.

Unter der Annahme, sortierten Eingangs-Array:

private static boolean isUnique(int[] array) 
{ 
    if (array.length <= 1) 
     return true; 

    int previous = array[0]; 

    for (int i = 1; i < array.length; i++) 
    { 
     if (previous == array[i]) 
     { 
      return false; 
     } 
     previous = array[i]; 
    } 

    return true; 
} 
+0

Sorry hah, ich konnte deine Lösung am Ende nicht ganz nachvollziehen. Ich bin ziemlich neu in dem Punkt, wo alles für mich ein Rätsel ist. Würde es dir etwas ausmachen, es zu erklären? Bitte: D – javanewbie

+0

@javanewbie Die Schleife vergleicht in jeder Iteration das vorherige Element mit dem aktuellen Element. Wenn Sie zwei aufeinanderfolgende gleiche Elemente finden, geben Sie false zurück. Wenn Sie das Ende der Schleife erreichen, ohne false zurückzugeben, bedeutet dies, dass alle Elemente eindeutig sind (vorausgesetzt, das Array ist sortiert), sodass Sie "true" zurückgeben. – Eran

+0

Aber überprüft es nicht nur die erste Nummer (in diesem Fall 1)? Sieht nicht wie die vorherigen Inkremente aus? : P – javanewbie