2016-04-10 6 views
-5

Im Moment enthält Ich habe meine boolean Setup wie folgt aus:Benötigen Sie Hilfe bei einer true/false boolean Ausführung, die eine for-Schleife und eine bedingte

public boolean deleteItem(String p) { 
    for(int i = this.myList.size() - 1; i > -1; i--) { 
     if(this.myList.get(i) == p) { 
      this.myList.remove(i); 
      return true; 
     } else { 
      return false; 
     } 
    } 
} 

Ich versuche, durch eine Arraylist zu gehen und String p löschen von der Array-Liste.Wenn jedoch der String p in der Arraylist existiert, muss ich die Zeichenfolge löschen und true zurückgeben. Wenn es nicht existiert, muss ich einfach falsch zurückgeben. Ich kodiere gerade in Eclipse und es besagt, dass die Return-Anweisungen, die ich gerade habe, nicht als die "erforderliche" Return-Anweisung, die ich brauche, zählen. Wie kann ich meinen Code reparieren, sodass er die Return-Anweisung (en) an der richtigen Stelle hat?

+2

Entfernen Sie den Else-Block und verschieben Sie 'return false;' außerhalb der for-Schleife. –

+2

Was @John sagte, plus '.equals()', um Strings zu vergleichen (nicht '=='). – Bohemian

+2

Verwenden Sie einen * Debugger *. Wir sind nicht dein Debugger. Wenn Sie den Code durchgehen, können Sie sofort Ihren Fehler sehen. – Andreas

Antwort

0

Sie haben einen Pfad durch Ihren Code, der nichts zurückgibt. Wenn Ihre Liste leer ist, wird die Schleife nicht ausgeführt und es wird nichts passieren. Auch Ihre Schleife wird zurückkehren, sobald Sie Ihr erstes Element mit True oder False verarbeiten.

Der Kommentar von John ist korrekt.

„Entfernen Sie den anderen Block und return false; außerhalb der for-Schleife bewegen.

1

Warum das Rad neu erfinden?

public boolean deleteItem(String p) { 
    return this.list.remove(p); 
} 
0

Ihre Funktion eine Reihe von Fehlern hat.

  1. Sie tun eine Referenz-Gleichheitsprüfung und nicht die Wert-Gleichheitsüberprüfung.Für eine Wert-Gleichheitsprüfung verwenden Sie immer die Methode "equals". Sie werden keine Compiler-Fehler für diese Art von Fehlern erhalten. Sie werden erhalten unerwünschte Ausgabe.
  2. Nicht alle Kontrollflüsse in Ihrer Funktion haben eine return-Anweisung, obwohl Ihre Methodensignatur eine nicht void return-Anweisung vorschlägt. Dies erzeugt einen Compiler-Fehler, den Sie in Ihrem Code sehen.
  3. Sie haben mehrere Return-Anweisungen. Dies ist weder ein Compilerfehler noch ein Laufzeitfehler. Aus der Sicht der guten Programmierpraxis ist es jedoch nicht die beste Idee, mehrere Return-Statements zu haben. Sie können eine Flag-basierte Return-Anweisung am Ende ausführen.
  4. Sie entfernen Elemente aus einem Auflistungsobjekt, während Sie es durchlaufen. Abhängig vom Typ des Sammlungsobjekts, das Sie verwenden, kann es zur Laufzeit eine ConcurrentModificationException-Ausnahme auslösen. Sie müssen stattdessen einen fehlersicheren Iterator verwenden, falls verfügbar.

Ich habe versucht, Ihr Programm zu korrigieren. Sehen Sie, wenn das besser Sinn macht:

Das obige Programm funktioniert, wenn der Iterator ausfallsicher ist. Z.B. Wenn Ihr myList-Objekt vom Typ CopyOnWriteArrayList ist, ist sein Iterator fehlersicher. Aber wenn Ihr myList-Objekt vom Typ einer solchen einfachen ArrayList ist, die einen schnellen Iterator zurückgibt, gibt Ihnen die obige Methode einen CME.

Wenn Ihr myList Sammlung Objekt vom Typ Liste ist, können Sie etwas so einfach versuchen, so:

public boolean deleteItem(String p) { 
    //removeAll will return true if at least 1 element is removed 
    return this.myList.removeAll(Collections.singletonList(p)); 
} 

Alternativ, wenn Sie Java 8 verwenden, können Sie wie etwas tun folgenden:

public boolean deleteItem(String p) { 
    //removeIf will return true if at least 1 element is removed 
    return this.myList.removeIf(item -> item != null && item.equals(p)); 
} 

Hoffe das hilft dir ein bisschen.

Verwandte Themen