Ich arbeite derzeit an einem Teil eines Programms, das den Benutzer auffordert, einer vorhandenen Liste von Kreuzfahrten eine neue Kreuzfahrt hinzuzufügen. Die Liste sieht derzeit so aus:

public static void initializeCruiseList() {
    Cruise newCruise = new Cruise("Southern Swirl", "Candy Cane", "Miami", "Cuba", "Miami");
    cruiseList.add(newCruise);

    Cruise newCruiseTwo = new Cruise("Hippy Train", "Ole Bertha", "Baltimore", "The 70s", "Baltimore");
    cruiseList.add(newCruiseTwo);
}

Das Problem, das ich habe, ist die Eingabe für den Abschnitt "Schiffsname" von "addCruise", um zu überprüfen, ob das Schiff bereits vorhanden ist, und um zu überprüfen, ob das Schiff in Betrieb ist, das als Boolescher Wert in der Schiffsliste vorhanden ist . Die Schiffsliste sieht aus wie:

    public static void initializeShipList() {
    add("Candy Cane", 20, 40, 10, 60, true);
    add("Peppermint Stick", 10, 20, 5, 40, true);
    add("Bon Bon", 12, 18, 2, 24, false);
    add("Candy Corn", 12, 18, 2, 24, false);
}

Der Teil, mit dem ich Probleme habe, ist der Vergleich der Benutzereingaben innerhalb der "addCruise" -Methode mit dem Schiffsnamen UND der booleschen Variablen, wenn man bedenkt, dass der Benutzer nur einen String eingibt. Derzeit habe ich Folgendes:

System.out.println("Enter ship name: ");
    String newShipName = newCruiseInput.nextLine();

    for(Ship eachShip: shipList) {
        if((eachShip.getShipName() != newShipName) && (eachShip.getInService() == false)) {
            System.out.println("This ship doesn't exist or isn't in service.");
            return;
        }
    }

Ich bin mir ziemlich sicher, dass das Problem bei diesem aktuellen Setup darin besteht, dass es über die gesamte Liste iteriert und unabhängig davon immer einen Eintrag findet, der "falsch" ist, sodass der Code so funktioniert, als hätte der Benutzer einen ungültigen Eintrag eingegeben, auch wenn sie taten es nicht. Wie finde ich den Schiffsnamen in einem Eintrag und überprüfe dann, ob das ausgewählte Schiff derzeit in Betrieb ist? Wenn Sie mehr Informationen benötigen, fragen Sie einfach und ich werde mein Bestes geben, um mehr zu liefern.

0
Bmore 23 Feb. 2020 im 09:11

4 Antworten

Beste Antwort

Versuchen Sie es mit einer Flagge

boolean shipFound = false;
for(Ship eachShip: shipList) {
        if((eachShip.getShipName().equals(newShipName)) && (eachShip.getInService() == true)) {
            shipFound=true;
            break;
        }
    }
if(shipFound)
// Do what you want
0
Trishul Singh Choudhary 23 Feb. 2020 im 06:27

Was ist mit dem Ersetzen der if-Bedingung in Ihrer for-Schleife durch so etwas?

for(Ship eachShip: shipList) {
    if( (!eachShip.getShipName().equals(newShipName)) || (eachShip.getShipName().equals(newShipName) && eachShip.getInService() != false) ) {
        System.out.println("This ship doesn't exist or isn't in service.");
        return;
    }else {
     //do add ship
    }
}
0
MOnkey 23 Feb. 2020 im 06:51

Das Problem liegt in der Bedingung if in Ihrer for -Schleife. Da es nicht die gesamte Liste iteriert und ungültig zurückgibt, wenn das erste nicht übereinstimmende Ergebnis gefunden wird.

Was Sie tun können, filtern Sie alle Elemente, die mit Ihren Schiffsnamen übereinstimmen, mit dem vom Benutzer eingegebenen Schiffsnamen und prüfen Sie dann, ob die Liste leer ist oder nicht.

Wenn es leer ist, bedeutet dies, dass es nicht existiert und im anderen Fall umgekehrt.

Ihr Code sollte ungefähr so aussehen:

if(shipList
        .stream()
        .filter(!eachShip -> eachShip.getShipName().equals(newShipName) 
            && !eachShip.getInService)
        .collect(Collectors.toList())
        .isEmpty()) {
        // Not found
} else {
       // Found the ship
}

Ich hoffe das ergibt Sinn.

0
Safeer Ansari 23 Feb. 2020 im 06:44

Ihre Logik in der for-Schleife ist falsch. Für Ihre Anforderung müssen Sie zuerst herausfinden, ob das Schiff in Ihrer Liste in der Schleife vorhanden ist. Wenn Sie es nicht finden, müssen Sie mit dieser Situation umgehen. Wenn Sie es jedoch finden, müssen Sie überprüfen, ob es in Betrieb ist. Sie können nicht beide in einer if-Bedingung zusammenführen. Beachten Sie außerdem, dass Sie für den String-Vergleich die Methode equals () von String verwenden müssen und nicht ! =

0
Gro 23 Feb. 2020 im 06:29