8.581
Bearbeitungen
Jneug (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
Jneug (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
(12 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
{{Navigation | {{Navigation}} | ||
== Zeichenketten in Java == | == Zeichenketten in Java == | ||
Im Gegensatz zu den [[wikipedia:Primitive Datentypen| | 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> | ||
{{ | {{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. | '''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'' | ||
{{ | eigene Klassen. Etwa die Klasse {{Java API|java.lang.Integer}}. Sie enthält hilfreiche Klassenmethoden zum Umgang mit Integern. | ||
{{Info:End}} | |||
== | <!--- | ||
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> | |||
Im Gegensatz zur Erwartung wird <code>Die Strings sind unterschiedlich.</code> ausgegeben. Der Operator <code>==</code> | |||
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 | 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 | 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 | <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]. |
Bearbeitungen