2016-05-20 5 views
2

So habe ich diese Methode, die die Namen für alle anzeigen, die eine übereinstimmende Teilzeichenfolge (nicht Groß-und Kleinschreibung) enthalten, und druckt die passenden Namen auf die JTextArea. Es sucht nach dem Namen aus einer Eingabedatei, die als Array gespeichert wurde. Aber wenn ich "Keine Ergebnisse gefunden" anzeigen möchte, wenn der Benutzer etwas eingibt, das nicht in der Datei vorhanden ist, zeigt es für alles "Keine Ergebnisse gefunden" an, sogar die Namen, die es gibt. Wenn ich die Anweisung heraushole, funktioniert meine Methode wieder korrekt und zeigt die richtigen Informationen an. Wie kann ich erreichen, dass "Keine Ergebnisse gefunden" angezeigt wird, ohne dass meine if-Anweisung nicht mehr funktioniert?Verwenden der if und else Statements

private void match(String targetSubstring) 
    { 
    displayArea.setText(""); 
    displayArea.append("FIND RESULTS for: " + targetSubstring); 
    displayArea.append("\n"); 
    displayArea.append("\n Name    Best Decade"); 
    displayArea.append("\n---------------   ---------------"); 
    targetSubstring = targetSubstring.toUpperCase(); 
    for (int i = 0; i < namesArray.length; i++) { 
     String theName = namesArray[i].getName(); 
     if (theName.toUpperCase().contains(targetSubstring)) 
     { 
     displayArea.append("\n" + namesArray[i].getName() + "\t" + namesArray[i].bestDecade()); 
     } 
     else 
     displayArea.append("\n No results found"); 
    } 
    } 

Antwort

6

Dieser Code hat einen logischen Fehler.

Es muss neu geschrieben als:

// flag to see if any matches are found 
boolean foundSomething = false; 

for (int i = 0; i < namesArray.length; i++) { 
    String theName = namesArray[i].getName(); 
    if (theName.toUpperCase().contains(targetSubstring)) 
    { 
     displayArea.append("\n" + namesArray[i].getName() + "\t" + namesArray[i].bestDecade()); 
     foundSomething = true; 
    } 
} 

// Now, if you didn't find anything, then add this 
if (!foundSomething) { 
     displayArea.append("\n No results found"); 
} 

Grund: die sonst Fall in der for-Schleife mit der „Keine Ergebnisse“ jederzeit einen einzigen Index in der NamenArr haben wird anhängen nicht finde einen Treffer.

1

Frage ist: enthält namesArray wirklich enthält targetSubstring? Meiner Meinung nach sollten Sie von der Extraktion beginnen

Um neue Methode und schreiben einige einfache Tests - ist diese Bedingung richtig?

Wenn der Test besagt, dass die Bedingung in Ordnung ist, dann sollten Sie diesen Teil des Codes debuggen und sehen, was mit den Daten in namesArray falsch ist. Weil Code in diesem Moment gut aussieht.

+0

Nein, es liegt ein logischer Fehler in seiner Schleife vor, bei dem für jedes Element im Array, das nicht mit der Teilzeichenfolge übereinstimmt, "keine Ergebnisse gefunden" gedruckt wird. Also ist der Code nicht ganz korrekt –

1

Das Problem hier ist, dass Sie "keine Ergebnisse gefunden" für jedes Element im Array drucken, das nicht mit dem Teilstring übereinstimmt. Wenn zum Beispiel das fünfte Element übereinstimmt, aber nicht die ersten vier, werden Sie für jedes dieser vier Elemente "keine Ergebnisse gefunden" ausgeben. Fügen Sie besser einen booleschen Wert hinzu, der Ihnen sagt, ob ein Element gefunden wurde. Überprüfen Sie nach der Schleife, ob dieser boolesche Wert Ihnen sagt, dass kein übereinstimmendes Element gefunden wurde. Informieren Sie in diesem Fall den Benutzer.

BTW: dies wäre nicht schwer mit einem Debugger zu finden gewesen.