Strings: mit Text arbeiten
Kurz gesagt: Ein String (Zeichenkette) ist Text, eine Folge von Zeichen mit Indizes ab 0: Er hat eine Länge und Methoden zum Suchen, Ersetzen, Ausschneiden, Aufteilen und Vergleichen.
Problem
Der Code stimmt, aber er wird nicht angenommen
Der Shop gibt mit dem Code SOMMER10 10% Rabatt. Ein Kunde schreibt ihn aus der Werbung ab. Er tippt ihn aber in Kleinbuchstaben und setzt aus Versehen ein Leerzeichen davor:
Scanner in = new Scanner(System.in);String code = in.nextLine();if (code.equals("SOMMER10")) { System.out.println("10% Rabatt");} else { System.out.println("Ungültiger Code");} sommer10Ungültiger CodeFür einen Menschen ist es derselbe Code. Für das Programm sind sommer10 und SOMMER10 verschiedene Texte: Der erste hat ein Zeichen mehr, und die Buchstaben sind andere. Du musst in einen Text hineinschauen und ihn reparieren können.
Die Idee
Text ist eine Folge von Zeichen
Text besteht aus Zeichen, die nacheinander stehen: Buchstaben, Ziffern, Leerzeichen, Satzzeichen. Jedes Zeichen hat einen Index, wie in einem Array. Das erste hat den Index 0.
String code = "SOMMER10";System.out.println(code.length());System.out.println(code.charAt(0));System.out.println(code.charAt(code.length() - 1));8S0code.length()ist die Anzahl der Zeichen.code.charAt(0)ist das Zeichen mit dem Index 0. Das letzte Zeichen hat den Indexlength() - 1.
Ein einzelnes Zeichen hat einen eigenen Typ: char. Du schreibst es in einfache Anführungszeichen: 'S', '0', ' '. Text steht in doppelten: "S" ist ein Text mit einem Zeichen, kein char.
Achte auf die Klammern: Bei Text heißt es length(), mit runden Klammern, weil es eine Methode ist. Bei einem Array heißt es length, ohne Klammern.
Sieh es dir an
Zeichen für Zeichen
Wie viele Ziffern hat die Telefonnummer? Du gehst mit einer Schleife durch die Indizes von 0 bis zum letzten und schaust dir jedes Zeichen an:
String phone = "0888 123 456";int digits = 0;for (int i = 0; i < phone.length(); i++) { char c = phone.charAt(i); if (c >= '0' && c <= '9') { digits++; }}System.out.println("Ziffern: " + digits);Ziffern: 10c >= '0' && c <= '9' funktioniert, weil jedes Zeichen in Wirklichkeit eine Zahl ist: sein Code in der Zeichentabelle. Die Ziffern von '0' bis '9' haben aufeinanderfolgende Codes, die Buchstaben von 'a' bis 'z' auch. Deshalb lassen sich Zeichen wie Zahlen vergleichen.
Genauer, für Neugierige
- Für solche Prüfungen gibt es fertige Methoden:
Character.isDigit(c),Character.isLetter(c),Character.isUpperCase(c),Character.isLowerCase(c). Sie kennen auch Umlaute wieä. - Den Code eines Zeichens bekommst du mit einer Umwandlung:
(int) 'A'ist 65. Umgekehrt ist(char) 66das Zeichen'B'. Deshalb ist'a' + 1die Zahl 98 und nicht der Buchstabeb. - Ohne Index:
for (char c : phone.toCharArray())geht durch die Zeichen, so wie for-each durch ein Array geht.
Probier es aus
Welches Zeichen?
Was gibt das Programm aus?
String word = "Auftrag";System.out.println(word.charAt(3));System.out.println(word.length());Die Indizes sind A 0, u 1, f 2, t 3. Das Zeichen mit dem Index 3 ist das vierte: „t“. Die Länge ist die Anzahl aller Zeichen, 7. Der letzte Index ist 6.
Die Idee
Die Methoden von Text
Text bringt fertige Methoden mit: Aktionen, die du mit einem Punkt hinter dem Text aufrufst. Hier ist die Reparatur für den Gutscheincode:
String code = " sommer10";String clean = code.trim().toUpperCase();System.out.println("[" + clean + "]");System.out.println(clean.equals("SOMMER10"));[SOMMER10]truetrim() entfernt die Leerzeichen vorne und hinten. toUpperCase() macht alle Buchstaben groß. Methoden lassen sich hintereinander aufrufen: Die erste gibt einen Text zurück, und auf ihm wird die zweite aufgerufen.
Noch ein paar, an einer E-Mail-Adresse:
String email = "ivan.petrov@mail.bg";System.out.println(email.contains("@"));System.out.println(email.indexOf("@"));System.out.println(email.substring(0, email.indexOf("@")));System.out.println(email.replace(".", " "));System.out.println(email.endsWith(".bg"));true11ivan.petrovivan petrov@mail bgtrue| Methode | Was sie macht |
|---|---|
contains(x) |
ob x darin vorkommt |
indexOf(x) |
der Index, an dem x zum ersten Mal steht (-1, wenn es fehlt) |
substring(a, b) |
ein Teil des Textes |
replace(x, y) |
jedes x wird durch y ersetzt |
startsWith(x), endsWith(x) |
ob er mit x beginnt (endet) |
toLowerCase() |
alle Buchstaben klein |
Genauer, für Neugierige
substring(a, b) nimmt die Zeichen von Index a bis Index b, ohne b. Ihre Anzahl ist b - a. Mit nur einem Argument nimmt es alles bis zum Ende:
String date = "2026-10-24";System.out.println(date.substring(5, 7));System.out.println(date.substring(8));1024Die Idee
Text ändert sich nicht
Es gibt eine Eigenheit, die am Anfang alle verwirrt:
String name = "maria";name.toUpperCase();System.out.println(name);name = name.toUpperCase();System.out.println(name);mariaMARIADie zweite Zeile bewirkt nichts Sichtbares. toUpperCase() ändert name nicht. Es erzeugt einen neuen Text in Großbuchstaben und gibt ihn zurück. Niemand speichert ihn, und er geht verloren.
Ein Text kann nach dem Erzeugen nicht mehr geändert werden. Man sagt, er ist unveränderlich (immutable). Jede Methode, die einen Text „ändert“, gibt in Wirklichkeit einen neuen zurück. Um ihn zu behalten, weist du ihn zu: name = name.toUpperCase();.
String name = "maria";name.toUpperCase();System.out.println(name);name = name.toUpperCase();System.out.println(name);Schritt für Schritt, in Worten
- In name steht der Text „maria“: 5 Zeichen mit den Indizes 0 bis 4.
- toUpperCase() rührt „maria“ nicht an. Es erzeugt einen neuen Text, „MARIA“.
- Niemand speichert den neuen Text, und er geht verloren.
- In name steht immer noch „maria“, und das wird ausgegeben.
- Wieder ein neuer Text, „MARIA“, aber jetzt speichert = ihn in name. Das alte „maria“ fällt weg.
- Jetzt steht in name „MARIA“.
Genauer, für Neugierige
- Deshalb ist
+=auf Text in einer langen Schleife langsam: Jeder Durchlauf erzeugt einen neuen Text und kopiert alles Bisherige. Für Hunderttausende Anhänge gibt esStringBuilder, ein Objekt, das sich ändern lässt. Wir sehen es im Modul „Text und Dateien“.
Probier es aus
Finde den Fehler
Der Benutzer gibt seine E-Mail mit Großbuchstaben und Leerzeichen ein. Das Programm soll sie bereinigen und ihn hereinlassen. Es sagt aber „Diesen Benutzer gibt es nicht.“. In welcher Zeile ist der Fehler?
Wähle die Zeile mit dem Fehler.
email.trim(); gibt einen neuen Text ohne die Leerzeichen zurück, aber er wird nirgends gespeichert. email hat immer noch die Leerzeichen. Die Korrektur ist email = email.trim();, genau wie in Zeile 2.
Die Idee
Text in Teilen
Oft enthält ein Text mehrere Dinge, getrennt durch ein Zeichen: Artikel durch ein Komma, Wörter durch ein Leerzeichen. split teilt ihn in Teile und gibt ein Array von Texten zurück:
String list = "Milch,Brot,Eier,Käse";String[] items = list.split(",");System.out.println("Artikel: " + items.length);for (int i = 0; i < items.length; i++) { System.out.println((i + 1) + ". " + items[i]);}Artikel: 41. Milch2. Brot3. Eier4. KäseDas Trennzeichen gehört nicht zu den Teilen. Ab hier arbeitest du mit einem normalen Array: Länge, Indizes, Schleife.
So liest du auch eine ganze Zeile mit Zahlen von der Tastatur: Du teilst sie auf und wandelst jeden Teil in eine Zahl um. Genau das hat dir in der letzten Lektion über Tabellen gefehlt:
Scanner in = new Scanner(System.in);String[] parts = in.nextLine().split(" ");int sum = 0;for (String p : parts) { sum += Integer.parseInt(p);}System.out.println(sum);42 38 51 47 60238Genauer, für Neugierige
splitbekommt einen regulären Ausdruck, keinen normalen Text. Die meisten Zeichen funktionieren direkt, aber.bedeutet „ein beliebiges Zeichen“: Für einen Punkt schreibst dusplit("\\."). Reguläre Ausdrücke kommen im Modul „Text und Dateien“.- Zwei Leerzeichen nebeneinander ergeben einen leeren Teil
""dazwischen.split(" +")(ein oder mehrere Leerzeichen) löst das. - Das Gegenteil von
splitistString.join(", ", items): Es fügt die Teile mit einem Trennzeichen zusammen.
Probier es aus
== oder equals?
Auf der ersten Karte wurde der Gutscheincode mit equals verglichen. Warum nicht mit ==, wie Zahlen? Die Eingabe ist admin:
Was gibt das Programm aus?
Scanner in = new Scanner(System.in);String user = in.nextLine();System.out.println(user == "admin");System.out.println(user.equals("admin"));Bei Texten vergleicht == nicht die Buchstaben. Es prüft, ob beide Seiten ein und dasselbe Objekt im Speicher sind. Der von der Tastatur gelesene Text ist ein neues Objekt, und "admin" im Code ist ein anderes. Die Buchstaben sind gleich, die Objekte nicht. equals vergleicht die Buchstaben und sagt true.
Die Regel: In Java vergleichst du Text immer mit equals. Wenn Groß- und Kleinschreibung keine Rolle spielen, nimm equalsIgnoreCase.
Genauer, für Neugierige
Manchmal „funktioniert“ ==: "admin" == "admin" ist true, weil Java gleiche Texte aus dem Code in einem einzigen Objekt aufbewahrt. Deshalb rutscht der Fehler beim Ausprobieren mit Text aus dem Code durch und zeigt sich erst bei echter Eingabe. Verlass dich nicht darauf.
Übung
Namen und Wörter
Löse die Aufgaben in deinem Editor. Der Text wird als ganze Zeile von der Tastatur gelesen.
1. Der Name rückwärts. Lies einen Namen ein und gib ihn von hinten nach vorne aus. Du gehst durch die Indizes vom letzten bis 0 und hängst die Zeichen an einen neuen Text an.
MariaairaM2. Anzahl der Wörter. Lies einen Satz ein und zähle die Wörter. Zwischen den Wörtern kann mehr als ein Leerzeichen stehen, und am Anfang und am Ende können Leerzeichen sein. Tipp: Ein Wort beginnt dort, wo das Zeichen kein Leerzeichen ist und das davor ein Leerzeichen ist (oder es davor keines gibt).
Heute ist ein FeiertagWörter: 43. Palindrom. Ein Palindrom liest sich von vorne nach hinten und von hinten nach vorne gleich. Leerzeichen und Großbuchstaben zählen nicht. Entferne die Leerzeichen, mach die Buchstaben klein und vergleiche das erste Zeichen mit dem letzten, das zweite mit dem vorletzten und so weiter.
Ein Esel lese nieEs ist ein PalindromKaffee mit MilchKein PalindromÜbung
Prüfen und zählen
4. Sicheres Passwort. Frag nach einem Passwort, bis der Benutzer ein sicheres eingibt: mindestens 8 Zeichen, mindestens eine Ziffer, ein Groß- und ein Kleinbuchstabe. Sag nach jedem schwachen Passwort, was verlangt wird. Tipp: do-while und eine Prüfung jedes Zeichens mit Character.isDigit, Character.isUpperCase, Character.isLowerCase.
kaffeekaffee2026Kaffee2026Passwort:Schwaches Passwort: mindestens 8 Zeichen, eine Ziffer, ein Groß- und ein Kleinbuchstabe.Passwort:Schwaches Passwort: mindestens 8 Zeichen, eine Ziffer, ein Groß- und ein Kleinbuchstabe.Passwort:Passwort akzeptiert.Weitere Aufgaben
- Kommas statt Leerzeichen. Lies einen Satz ein und ersetze jedes Leerzeichen durch ein Komma.
Morgen fahren wir nach Varna→Morgen,fahren,wir,nach,Varna. - Der längste Name. Lies durch Kommas getrennte Namen ein und gib den längsten aus.
Ana,Kristina,Peter→Kristina. - Vokale als Sternchen. Ersetze jeden Vokal (a, e, i, o, u) durch
*, egal ob groß oder klein.Ich trinke Kaffee→*ch tr*nk* K*ff**. - Häufigkeit der Buchstaben. Zähle, wie oft jeder Buchstabe im Text vorkommt, ohne Unterschied zwischen groß und klein. Tipp: ein Array mit 26 Zählern, einer für jeden Buchstaben von
'a'bis'z'(Umlaute und ß lässt du weg). Der Index des Buchstabenscistc - 'a'. Gib nur die Buchstaben aus, die vorkommen. - Zeichendiagramm. Wie die Aufgabe oben, aber statt der Zahl gibst du so viele Sternchen aus:
a: ****. - Wie oft jedes Wort. Lies einen Satz ein und gib für jedes verschiedene Wort aus, wie oft es vorkommt. Tipp: Teile ihn in Wörter auf und prüfe für jedes Wort, ob es schon weiter vorne im Array gezählt wurde.
- Nach Länge sortieren. Lies durch Leerzeichen getrennte Wörter ein und gib sie vom kürzesten bis zum längsten aus. Sortiere das Array so, wie du Zahlen sortiert hast, aber vergleiche die Längen.
- Anzahl der Sätze. Zähle die Sätze in einem Text: Jeder endet mit
.,!oder?. Achte auf...und?!: Sie beenden einen Satz, nicht drei. - Ausgeglichene Klammern. Prüfe, ob die Klammern in einem Text ausgeglichen sind. Bei einer Art von Klammern reicht ein Zähler:
(addiert 1,)zieht 1 ab. Der Zähler darf nie unter 0 fallen, und am Ende muss er 0 sein. Bei drei Arten,(),[],{}, brauchst du ein Array von Zeichen, in dem du die offenen Klammern aufbewahrst, und einen Zähler, wie voll es ist. Bei einer schließenden Klammer muss die letzte offene von derselben Art sein.{[()]}ist ausgeglichen,([)]nicht.
Test
Teste dich
Verwandte Lektionen
Abschnitt „Verwandte Lektionen“- Baut auf: Operatoren und Arithmetik · Bedingungen · Schleifen · Arrays
- Geht weiter in: Werfen und eigene Exceptions · Strings · Reguläre Ausdrücke · Reguläre Ausdrücke: Gruppen und Ersetzen
- Aufgaben zum Thema: Sprachgrundlagen