11 Strings vergleichen

Aufgabe

Aufgabe 11-1: Enthalten zwei Strings den gleichen Text?

Das folgende Demo-Programm fordert den Benutzer auf einen Benutzernamen zu wählen. Gibt der Benutzer daraufhin „Administrator“ ein, soll er die Meldung erhalten, dass dieser Benutzername nicht möglich ist. In allen anderen Fällen soll er mit dem gewählten Benutzernamen begrüßt werden.

Lesen Sie zunächst den Abschnitt „Merke: Identische Objekte (==) vs. Objekte mit gleichem Inhalt (equals())“ und klären Sie anschließend, welcher der beiden folgenden Ausdrücke im Quellcode ergänzt werden muss. Begründen Sie Ihre Entscheidung.

  1. benutzername=="Administrator"
  2. benutzername.equals("Administrator")
JAVA
import java.util.Scanner;

public class Zeichenkettenvergleich {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String benutzername;
        
        System.out.print("Bitte wählen Sie einen Benutzernamen: ");
        benutzername = scanner.next();
        
        if                 ?                  ) {
            System.out.println("Der Benutzername darf nicht 'Administrator' lauten!");
        }
        else {
            System.out.println("Willkommen " + benutzername + "!");
        }
    }

}
Abb. 11-1: Klasse Zeichenkettenvergleich (Quellcode)
Lösung
Lösung

Der String benutzername enthält den vom Benutzer eingegebenen Benutzernamen. Im Quellcode muss geprüft werden, ob der Inhalt dieses Strings mit dem Inhalt des Strings "Administrator" übereinstimmt. Hierzu wird die Methode equals(anObject: Object): boolean der Klasse String verwendet.

Verweisen die Ausdrücke links und rechts des Gleichheitsoperators (==) auf ein Objekt, ist das Ergebnis der Auswertung true, wenn beide Ausdrücke auf das gleiche Objekt verweisen, andernfalls false. Der Gleichheitsoperator ist damit nicht dazu geeignet, festzustellen, ob zwei unterschiedliche Objekte den gleichen Inhalt (Attributwerte) besitzen.

Um zu prüfen, ob zwei verschiedene String-Objekte den gleichen Text (Zeichenkette) enthalten, verwendet man die Methode equals(anObject: Object): boolean der Klasse String1.

Merke: Identische Objekte (==) vs. Objekte mit gleichem Inhalt (equals())
img/Abb_11_2_UML_String.svg
java.lang.String
public boolean equals(Object anObject)
Wird die equals-Methode eines String-Objekts aufgerufen und ihr ein beliebiger String übergeben vergleicht das String-Objekt den Inhalt des übergebenen Strings mit seinem eigenen und gibt bei Übereinstimmung true, andernfalls false zurück.
Abb. 11-2: Klasse String
Aufgabe

Aufgabe 11-2: Stein, Papier, Schere

Programmieren Sie das Spiel „Stein, Papier, Schere“. Nutzen Sie dazu die bereits vorliegenden Klassen (vgl. Abb. 11-4). Die Benutzeroberfläche und die Startklasse sind bereits fertiggestellt. In der Fachklasse SteinPapierSchere müssen jedoch noch die Spielregeln codiert werden.

Konsole
Stein, Papier, Schere
----------------------------------------------------------
Bitte geben Sie Ihre Wahl ein (Stein, Papier oder Schere):
Spieler 1: Stein
Spieler 2: Papier
==========================================================
Spieler 2 gewinnt!
Abb. 11-3: Konsole mit Benutzereingaben (Beispieldaten)
img/Abb_11_4_UML_SteinPapierSchere.svg
Abb. 11-4: Stein, Papier, Schere (UML-Klassendiagramm)
Aufgabe

Die Methode +spielen(pFigurSpieler1: String, pFigurSpieler2: String): String erwartet die Übergabe zweier Strings. Der erste String stellt die von Spieler 1 gewählte Figur dar, der zweite die von Spieler 2 gewählte Figur. Erlaubt sind die Eingaben „Stein“, „Papier“ und „Schere“. Als Antwort soll die Methode entweder den Sieger oder bei einer unerlaubten Eingabe einen entsprechenden Hinweis zurückgeben.

Vervollständigen Sie den Quellcode der Methode entsprechend.

Lösung
Lösung
JAVA
package app;

public class SteinPapierSchere {
    
    public String spielen(String pFigurSpieler1, String pFigurSpieler2) {
        String ausgabe="Fehlerhafte Eingabe. Gültige Eingaben sind: Stein, Papier und Schere.";
        
        if(pFigurSpieler1.equals("Stein")) {
            if(pFigurSpieler2.equals("Stein")) {
                ausgabe = "unentschieden!";
            }
            else if(pFigurSpieler2.equals("Papier")) {
                ausgabe = "Spieler 2 gewinnt!";
            }
            else if(pFigurSpieler2.equals("Schere")) {
                ausgabe = "Spieler 1 gewinnt!";
            }
        }
        else if(pFigurSpieler1.equals("Papier")) {
            if(pFigurSpieler2.equals("Stein")) {
                ausgabe = "Spieler 1 gewinnt!";
            }
            else if(pFigurSpieler2.equals("Papier")) {
                ausgabe = "unentschieden!";
            }
            else if(pFigurSpieler2.equals("Schere")) {
                ausgabe = "Spieler 2 gewinnt!";
            }
        }
        else if(pFigurSpieler1.equals("Schere")) {
            if(pFigurSpieler2.equals("Stein")) {
                ausgabe = "Spieler 2 gewinnt!";
            }
            else if(pFigurSpieler2.equals("Papier")) {
                ausgabe = "Spieler 1 gewinnt!";
            }
            else if(pFigurSpieler2.equals("Schere")) {
                ausgabe = "unentschieden!";
            }
        }
        
        return ausgabe;
    }

}
Abb. 14-13: Klasse Szenario (Quellcode)