2016-12-07 6 views
-1

Diese Methode soll durch eine Arraylist von TV-Serien-Objekten suchen. Das J ++ in meiner for-Schleife gibt jedoch einen toten Codefehler, und die Eingabe eines Titels, der momentan nicht in der Arraylist gespeichert ist, verursacht eine Endlosschleife. Keine Ahnung warum. SOS Bearbeiten; Der Vortragende, die diese Zuordnung festgelegt wird, um die Verwendung von IteratorenInfinite Loop und Dead-Code für Loop

public void deleteseries(Scanner sc){ 

    System.out.println("Enter the Title of the Series you want to Remove"); 
    System.out.println("Cureent Series Stored: "); 
    for (TV_Series tv:series) { 
     System.out.println(tv.getTitle()); 
    } 
    String title_to_delete = sc.nextLine().toUpperCase(); 
    boolean found = false; 
    do{ 
     for(int j = 0; j < series.size(); j++){ 
      if (series.get(j).getTitle().equalsIgnoreCase(title_to_delete)) 
       { 
        series.remove(j); 
        System.out.println("Series Removed"); 
        found=true; 
        //Jump out of loop 

        break; 
       } 
      else 
       { 
        System.out.println("No Results for Title "+title_to_delete); 
        found = false; 
        break; 
       } 
     } 
    }while(found==false); 
} 
+4

* Was * 'i ++' in der for-Schleife? – RealSkeptic

+2

Sie * brechen * Art der bedingungslos aus der 'for' Schleife. Daher muss der "Inkrement" -Teil der Schleife niemals ausgeführt werden. –

+0

Warum haben Sie verschachtelte Schleifen, wenn Sie nur einen Datensatz durchsuchen? – Coder

Antwort

1

Es gibt mehrere ähnliche Fragen hier nicht erlaubt; Ich denke, dass Sie möglicherweise überprüfen müssen, wie Schleifenstrukturen von oben funktionieren.

Sie haben eine for-Schleife codiert, die über das Array iterieren sollte; das ist gut. Aber anstatt es iterieren zu lassen, haben Sie es so eingerichtet, dass Sie während der 1. Iteration aus der Schleife ausbrechen. Ich nehme an, Sie haben es in eine do-while-Schleife eingeschlossen, weil Sie bemerkt haben, dass es nicht iterierte, sondern dass die erste Wiederholung der Schleife einfach immer wieder ausgeführt wird. Die Ausgangsbedingung der Schleife do-while würde sein, die true dreht, weshalb die Schleife nicht beendet wird, wenn eine Übereinstimmung nicht gefunden wird.

Im Allgemeinen müssen Sie keinen for in einem while einschließen, um Iteration zu erhalten; for ist eine Schleifenstruktur für sich. Der einzige Grund, warum Ihr for nicht selbst iteriert, ist, dass Sie break Anweisungen eingeben; Die Verwendung von break zum Beenden einer for-Schleife wird nur benötigt, wenn Sie die Iteration abbrechen möchten. So könnte es Sinn machen break im if Block, aber sicherlich nicht der else Block.

Schließlich wird der else Block wie geschrieben für jede Iteration ausgeführt (sobald die anderen Probleme behoben sind); Es macht keinen Sinn, bei jeder Iteration "Keine Übereinstimmung gefunden" zu sagen. Sie könnten einen if Block nach die for-Schleife setzen, um einen Fehler zu drucken, wenn die Schleife alle Iterationen durchlaufen würde, ohne eine Übereinstimmung zu finden (d. H. Wenn immer noch falsch ist).

+0

Also entfernen Sie die Do-While-Schleife und die Else-Anweisung, und legen Sie eine If außerhalb der For-Schleife? – qubcoder

1

Beide if und else Teil sind break in der internen for Schleife.

Auch, wenn Sie suchen möchten und zu entfernen, nur unter Verwendung:

Auch benutzte ich Iterator, weil die Liste geändert werden soll, während Looping.

public void deleteseries(Scanner sc){ 

    System.out.println("Enter the Title of the Series you want to Remove"); 
    System.out.println("Cureent Series Stored: "); 
    for (TV_Series tv:series) { 
     System.out.println(tv.getTitle()); 
    } 
    String title_to_delete = sc.nextLine().toUpperCase(); 
    boolean found = false; 
    //do{ 
     for(Iterator<TV_Series> itr = series.iterator(); itr.hasNext();){ 
      TV_Series tvs = itr.next(); 
      if (tvs.getTitle().equalsIgnoreCase(title_to_delete)) 
       { 
        itr.remove(); 
        System.out.println("Series Removed"); 
        found=true; 
        //Jump out of loop 

        break; 
       } 
       //else 
       //{ 
       // System.out.println("No Results for Title "+title_to_delete); 
       // found = false; 
       // break; 
       //} 
     } 
// }while(found==false); 
} 
1

Wenn iterable Kollektionen modifing würde ich empfehlen Iteratoren mit "ConcurrentModificationException" zu verhindern. Außerdem habe ich überflüssigen Code wie Do-While-Teil gelöscht, um i ++ - Problem und für saubereren Code zu beheben. Überprüfen Sie meinen Vorschlag:

public void deleteseries(Scanner sc){ 

    System.out.println("Enter the Title of the Series you want to Remove"); 
    System.out.println("Cureent Series Stored: "); 
    for (TV_Series tv:series) { 
     System.out.println(tv.getTitle()); 
    } 
    String title_to_delete = sc.nextLine().toUpperCase(); 
    Iterator<TV_Series> it = series.iterator(); 
    while (it.hasNext()){ 
     TV_Series tmpSeries = it.next(); 
     if (tmpSeries.getTitle().equalsIgnoreCase(title_to_delete)) { 
      it.remove(); 
      System.out.println("Series Removed"); 
      break; 
     } 
    } 
}