Lernpfad:Würfelspiel in Java/Mit Strings arbeiten: Unterschied zwischen den Versionen

keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(12 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
{{Navigation/Lernpfad|Ein- und Ausgabe auf der Kommandozeile|Komplexe Rechenoperationen}}
{{Navigation}}


== Zeichenketten in Java ==
== Zeichenketten in Java ==
Im Gegensatz zu den [[wikipedia:Primitive Datentypen|Primitiven Datentypen]] wie <code>byte</code>,  
Im Gegensatz zu den [[wikipedia:Primitive Datentypen|primitiven Datentypen]] wie <code>byte</code>,  
<code>int</code> oder <code>boolean</code> sind Zeichenketten in Java Objekte der
<code>int</code> oder <code>boolean</code> sind Zeichenketten in Java Objekte der
[https://docs.oracle.com/javase/8/docs/api/java/lang/String.html Klasse String]. Das bedeutete, dass jeder
[https://docs.oracle.com/javase/8/docs/api/java/lang/String.html Klasse String]. Das bedeutete, dass jeder
Zeile 14: Zeile 14:
</syntaxhighlight>
</syntaxhighlight>


{{Hint:Start}}
{{Info:Start}}
'''Hinweis''' Auf einem <code>int</code> können zum Beispiel keine Methoden aufgerufen werden, da Integer zunächst keine Objekte sind. Die Java Klassenbibliothek enthält aber auch für diese ''primitiven Datentypen'' eigene Klassen. Zum Beispiel die [https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html Klasse Integer]. Sie enthält unter anderem hilfreiche Klassenmethoden
'''Hinweis''' Auf einem <code>int</code> können zum Beispiel keine Methoden aufgerufen werden, da Integer  
zum Umgang mit Integern.
zunächst keine Objekte sind. Die Java Klassenbibliothek enthält aber auch für diese ''primitiven Datentypen''  
{{Hint:End}}
eigene Klassen. Etwa die Klasse {{Java API|java.lang.Integer}}. Sie enthält hilfreiche Klassenmethoden zum Umgang mit Integern.
{{Info:End}}


== Strings formatieren ==
<!---
Zeichenketten müssen in Programmen sehr häufig zur Laufzeit des Programms aus variablen Inhalten zusammengesetzt werden. Am Ende des Würfelspiels könnte man zum Beispiel die Nachricht ''"Spieler 1 hat gewonnen"'' bzw. ''"Spieler 2 hat gewonnen"'' anzeigen lassen. Die Nummer des Spielers ist hier variabel, je nachdem, welcher Spieler gewonnen hat. Noch schöner wäre es, wenn zusätzlich der Name des Spielers angezeigt würde.
Da Strings Objekte sind, kann es bei ihrer Verwendung zu unerwarteten Fehlern kommen. Ein häufiges Problem ist der
Vergleich von Strings:
<syntaxhighlight lang="java" line="1">
String s1 = "Test";
String s2 = "Test";
if( s1 == s2 ) {
System.out.println("Die Strings sind gleich.");
} else {
System.out.println("Die Strings sind unterschiedlich.");
}
</syntaxhighlight>


Um mit solchen Situationen umzugehen haben sich Zeichenketten mit besonderen Formatierungszeichen und die [https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#format-java.lang.String-java.lang.Object...- format-Methode] etabliert.
Im Gegensatz zur Erwartung wird <code>Die Strings sind unterschiedlich.</code> ausgegeben. Der Operator <code>==</code>
Für obige Situation könnte der String wie folgt aussehen:
vergleicht bei Objekten die Objektidentität, also ob es sich um dasselbe Objekt handelt. Oben werden zwei Objekte der Klasse
String mit dem gleichen Inhalt <code>Test</code> erzeugt. Da es sich aber um unterschiedliche Objekte handelt, ergibt der Vergleich
<code>false</code>.  


Statt dessen sollte zum Vergleich der Inhalte - also der Zeichenketten - die Methode [https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#equals-java.lang.Object- String#equals(String)] verwendet werden.
<syntaxhighlight lang="java" line="1">
<syntaxhighlight lang="java" line="1">
if( s1.equals(s2) ) {
System.out.println("Die Strings sind gleich.");
} else {
System.out.println("Die Strings sind unterschiedlich.");
}
</syntaxhighlight>
Jetzt ist die Ausgabe wie erwartet <code>Die Strings sind gleich.</code>.
--->
== Zeichenketten formatieren ==
Zeichenketten müssen in Programmen regelmäßig zur Laufzeit des Programms aus variablen Inhalten zusammengesetzt
werden. Am Ende des Würfelspiels könnte man beispielsweise die Nachricht ''"Spieler 1 hat gewonnen"'' bzw. ''"Spieler 2
hat gewonnen"'' anzeigen lassen. Die Nummer des Spielers ist hier variabel, je nachdem, welcher Spieler gewonnen hat.
Noch schöner wäre es, wenn zusätzlich der Name des Spielers angezeigt würde.
Um mit solchen Situationen umzugehen, haben sich Zeichenketten mit besonderen Formatierungszeichen und die {{Java API|java.lang.String|format-java.lang.String-java.lang.Object...-|format-Methode}} etabliert. Für obige Situation könnte der String wie folgt aussehen:
<syntaxhighlight lang="java">
String botschaft = "Spieler %d (%s) hat gewonnen";
String botschaft = "Spieler %d (%s) hat gewonnen";
</syntaxhighlight>
</syntaxhighlight>


Die Formatierungszeichen beginnen jeweils mit einem <code>%</code>. Das Zeichen <code>%d</code> steht für '''''d'''ecimal number'', das Zeichen <code>%s</code> für '''''S'''tring''. An Stelle des ersten Platzhalters soll also eine Dezimalzahl, an Stelle des Zweiten eine Zeichenkette eingesetzt werden.
Die Formatierungszeichen beginnen jeweils mit einem <code>%</code>. Das Zeichen <code>%d</code> steht für '''''d'''ecimal
Mittels <code>format</code> kann man nun beliebige Werte einsetzen:
number'', das Zeichen <code>%s</code> für '''''S'''tring''. An Stelle des ersten Platzhalters soll also eine Zahl (in diesem Fall eine Ganzzahl), an Stelle des Zweiten eine Zeichenkette eingesetzt werden. Mittels <code>format</code> kann man nun  
beliebige Werte einfügen:


<syntaxhighlight lang="java" line="1">
<syntaxhighlight lang="java">
String.format(botschaft, 1, "Hannes"); // Spieler 1 (Hannes) hat gewonnen
String.format(botschaft, 1, "Hannes"); // Spieler 1 (Hannes) hat gewonnen
String.format(botschaft, 2, "Johanna"); // Spieler 2 (Johanna) hat gewonnen
String.format(botschaft, 2, "Johanna"); // Spieler 2 (Johanna) hat gewonnen
String.format(botschaft, 300, "Susanna"); // Spieler 300 (Susanna) hat gewonnen
String.format(botschaft, 300, "Susanna"); // Spieler 300 (Susanna) hat gewonnen
</syntaxhighlight>
</syntaxhighlight>
Doch die Formatierungsmöglichkeiten gehen noch weiter als bloßes ersetzen. Soll zum Beispiel der Punktestand der Spieler als
Rangliste angezeigt werden, dann müssen die Punktzahlen passend untereinander stehen (rechtsbündig). Dazu könnte man
die Punktzahlen nach links mit Nullen auffüllen, bis alle Punktzahlen gleich viele Zeichen haben.
<syntaxhighlight lang="java">
String eintrag = "%d. %12s: %06d";
String.format(eintrag, 1, "Tim", 1099);  // 1.        Tim: 001099
String.format(eintrag, 2, "Hannes", 100); // 2.      Hannes: 000100
String.format(eintrag, 3, "Johanna", 99); // 3.    Johanna: 000099
</syntaxhighlight>
In diesem Beispiel enthält der String drei Platzhalter:
# <code>%d</code> erwartet wie oben eine Ganzzahl.
# <code>%12s</code> erwartet einen String und reserviert für diesen 12 Stellen. Ist die erhaltene Zeichenkette kürzer, dann werden so viele Leerzeichen eingefügt, dass insgesamt 12 Zeichen vorhanden sind.
# <code>%06d</code> ist wieder eine Ganzzahl, es sind 6 Zeichen vorgesehen, aber an Stelle eines Leerzeichens wird die Ziffer <code>0</code> zum Auffüllen genutzt.
Eine kurze [http://www.hpg-speyer.de/pdf/unterrichtsfaecher/informatik/printf.pdf Übersicht der Ausgabemethoden und Platzhalter-Befehle gibt es in diesem PDF].
Anstatt einen neuen String zu erzeugen und zu speichern, kann die erzeugte Zeichenkette auch direkt [[Lernpfad:Würfelspiel in Java/Ein- und Ausgabe auf der Kommandozeile#Ausgaben_auf_der_Kommandozeile|auf der Kommandozeile ausgegeben]] werden.
<syntaxhighlight lang="java">
String eintrag = "%d. %12s: %06d";
System.out.printf(eintrag, 1, "Tim", 1099);
</syntaxhighlight>
== Zeichenketten in andere Datentypen umwandeln ==
Manchmal möchte man eine Zeichenkette in einen anderen Datentyp umwandeln. Zum Beispiel kann man mit dem String <code>"4.1"</code> nicht rechnen, aber mit dem Double-Wert <code>4.1</code> schon. Für solche Umwandlungen bieten die Datentyp-Klassen (siehe Hinweis oben) des Zieldatentyps (hier <code>double</code>) entsprechende Methoden.
Die Umwandlung im Beispiel könnte wie folgt vorgenommen werden:
<syntaxhighlight lang="java" line="1">
String zahlAlsString = "4.1";
double zahlAlsDouble = Double.parseDouble(zahlAlsString);
// Nun kann mit zahlAlsDouble gerechnet werden
double ergebnis = zahlAlsDouble + 0.9; // 5.0
</syntaxhighlight>
Für andere Datentypen gibt es entsprechende Methoden:
<syntaxhighlight lang="java" line="1">
Double.parseDouble("4.1");
Integer.parseInt("5");
Boolean.parseBoolean("false");
// Java bietet noch andere Datentypen, als die obigen:
Byte.parseByte("1");
Short.parseShort("7");
Long.parseLong("110399488427273");
Float.parseFloat("4.1");
</syntaxhighlight>
Die Datentyp-Klassen liegen im Paket [https://docs.oracle.com/javase/8/docs/api/java/lang/package-summary.html java.lang].
8.581

Bearbeitungen