1. Zeichenkettenverarbeitung
Zum Speichern von Zeichen und Zeichenfolgen stehen in Java die Typen char
, Character
, String
und StringBuilder
bereit. Der Einsatz der Datentypen muss geübt werden, denn jeder Typ hat seine Berechtigung. Die Aufgaben bringen den Lesern die Vor- und Nachteile der einzelnen Datentypen nahe.
Voraussetzungen
API von
String
undStringBuilder
sicher nutzen könnenAPI von
String
undStringBuilder
sicher nutzen könnenerkennen, wann
String
undStringBuilder
besser geeignet ist
Verwendete Datentypen in diesem Kapitel:
1.1. Die Klasse String und ihre Eigenschaften
String
ist nicht nur ein Datentyp, der für immutable Zeichenfolgen steht, sondern die Klasse bietet auch eine große Anzahl von Methoden. Wer die Methoden kennt und zu nutzen weiß, kann sich viel Arbeit sparen.
1.1.1. Quiz: Ist String ein eingebautes Schlüsselwort? ⭐
Java hat eingebaute Datentypen, darunter int
, double
, boolean
. Ist String
ebenfalls ein primitiver eingebauter Datentyp? Ist String
ein Schlüsselwort in Java?
1.1.2. HTML-Elemente aufbauen mit einfacher Konkatenation ⭐
Zur Erinnerung: In HTML werden für Auszeichnungen Tags eingesetzt, ein Beispiel ist <strong><em>Emphasized and Italics</em></strong>
.
Aufgabe:
Schreibe eine neue Methode
htmlElement(String tag, String body)
, die einen Stringbody
mit einem Start- und End-Tagtag
einrahmt und als neuenString
zurückgibt. Es gibt folgende Sonderbehandlung:Ist
tag
gleichnull
oder leer (""
) so wird nur derbody
betrachtet und keine Start-End-Tags geschrieben.Ist
body
gleichnull
, so gilt das wie ein übergebener Leer-String.
Schreibe zwei neue Methoden
strong(String)
undemphasized(String)
, die im Hintergrund mithtmlElement(…)
arbeiten und ein<strong>
respektive<em>
erzeugen.
Beispiel:
htmlElement( "strong", "strong is bold" )
→"<strong>strong is bold</strong>"
strong( emphasized( "strong + emphasized" ) )
→"<strong><em>strong + emphasized</em></strong>"
htmlElement( "span", null )
→"<span></span>"
htmlElement( "", "no" )
→"no"
htmlElement( null, "not strong" )
→"not strong"
htmlElement( null, null )
→""
Hinweis: Es gibt durchaus einige Anforderungen an Tag-Namen, die ein richtiges Programm prüfen könnte. So dürfen Tag-Namen nur die Ziffern 0 bis 9 sowie Groß- und Kleinbuchstaben enthalten. Diese Fälle können ignoriert werden.
1.1.3. Sichere Übermittlung durch Verdoppelung der Zeichen prüfen ⭐
Bamboo Blobfish nutzt einen Typendrucktelegraf, um Bonny Brain wichtige Nachrichten mitzuteilen. Da es auf jedes Zeichen ankommt, sendet Bamboo alle Zeichen zur Sicherheit zweimal hintereinander.
Aufgabe:
Schreibe eine Methode
int isEveryCharacterTwice(String)
, die prüft, ob jedes Zeichen im String zweimal hintereinander vorkommt.Ist die Anzahl der Symbole ungerade, ist die Nachricht falsch und die Rückgabe der Methode
0
.Kommt jedes Zeichen zweimal vor, ist die Antwort eine beliebige positive Zahl. ˗ Wenn ein Zeichen nicht zweimal hintereinander vorkommt, gibt die Methode die Position mit der ersten falschen Stelle zurück, allerdings negiert.
Beispiele:
isEveryCharacterTwice("eehhrrwwüürrddiiggeerr$$ccaappttaaiinn")
→1
isEveryCharacterTwice("ccapptttaaiinn")
→-3
isEveryCharacterTwice("222")
→0
isEveryCharacterTwice(null)
→NullPointerException
Dass ein negativer Index gewisse Stellen markiert, ist auch in der Java-Bibliothek zu finden. Die |
1.1.4. Y und Z vertauschen ⭐
Captain CiaoCiao tippt auf seiner Tastatur einen längeren Text, und spät fällt ihm auf, dass statt des deutschen Tastaturlayouts das englische aktiviert ist. Jetzt sind »y« und »z«, bzw. »Y« und »Z« vertauscht. Der Text muss korrigiert werden.
Aufgabe:
Lege eine neue Klasse
YZswapper
an.Setze in die Klasse eine neue Klassenmethode
void printSwappedYZ(String string)
, die einen übergebenenString
auf den Bildschirm bringt, aber den Buchstaben »y« als »z«, »z« als »y«, »Y« als »Z« und »Z« als »Y« ausgibt. Es geht nicht darum, einen String aus der Methode zurückzuliefern!Schreibe nicht nur eine Variante, sondern versuche, mindestens zwei Varianten zu programmieren. Es gibt zum Beispiel, die Möglichkeit die Zeichen mit
if
-else
zu prüfen oder mitswitch
-case
.
Beispiele:
printSwappedYZ("yootaxz")
ergibt auf dem Bildschirm die Ausgabezootaxy
undprintSwappedYZ("Yanthoxzl")
die AusgabeZanthoxyl
.
1.1.5. Trotzige Antworten geben ⭐
Tony der Trotzige ist für die Aktivitäten auf dem Schwarzmarkt von Captain CiaoCiao zuständig, doch er wird geschnappt und von der Polizei verhört. Um die Polizisten zu nerven, wiederholt er alles, was sie sagen, und setzt ein »No idea!« hintendran. Fragt der Polizist: »Where is the illegal whiskey distillery?«, sagt Tony: »Where is the illegal whiskey distillery? No idea!«
Aufgabe:
Lege eine neue Klasse an, und frage von der Kommandozeile eine Eingabe ab.
Abhängig von der Eingabe sollen drei Fälle unterschieden werden:
Wenn die Eingabe mit einem ? endet, dann gib auf dem Bildschirm aus, was von der Eingabe kommt, und hänge aber
" No idea!"
hinten an.Wenn von der Polizei keine Frage gestellt wird — die Eingabe endet nicht mit
?
— hält Tony der Trotzige ganz seinen Mund.Kommt von der Eingabe die spezielle Eingabe
"No idea?"
, und das unabhängig von der Groß-/Kleinschreibung, erwidert Tony trotzig:"Aye!"
1.1.6. Quiz: String-Vergleiche mit == und equals(…) ⭐
Strings sind Objekte, und daher gibt es prinzipiell zwei Möglichkeiten, sie zu vergleichen:
mit dem Vergleich der Referenzen über
==
über die für Objekte typische Methode
equals(Object)
Welchen Unterschied macht das?
1.1.7. Quiz: Ist equals(…) symmetrisch? ⭐
Unter der Annahme, dass s
ein String
ist: Gibt es einen Unterschied zwischen s.equals("tutego")
und "tutego".equals(s)
?
1.1.8. Zeichenfolgen auf Palindrom-Eigenschaft testen ⭐
Ein Palindrom ist ein Wort, das sich von vorne wie von hinten gleich liest, etwa »Otto« oder auch »121«.
Dass es überhaupt solche Wörter und sogar Sätze gibt, amüsiert Captain CiaoCiao, kann er damit doch die Gesellschaft unterhalten. Allerdings legt man ihm immer wieder Zeichenfolgen vor, die keine Palindrome sind. Daher müssen alle Wörter vorher getestet werden.
Aufgabe:
Schreibe ein Java-Programm, das untersucht, ob eine Zeichenkette ein Palindrom ist.
Lege eine neue Klasse
PalindromeTester
an.Implementiere eine statische Methode
boolean isPalindrome(String s)
.Erweitere das Programm um eine Klassenmethode
boolean isPalindromeIgnoringCase(String s)
, sodass der Test unabhängig von der Groß-/Kleinschreibung wird.Jetzt sollen auch alle Zeichen ignoriert werden, die keine Buchstaben oder Ziffern sind. Bei der Feststellung hilft
Character.isLetterOrDigit(char)
. Damit kann man auch Sätze wie »A man a plan a canal Panama« oder »Pepe in Tahiti hat nie Pep« oder »Sei fies – stets sei fies!« prüfen. Nennen wir die MethodeisPalindromeIgnoringNonLettersAndDigits(String)
.
1.1.9. Prüfen, ob Captain CiaoCiao in der Mitte steht ⭐
Captain CiaoCiao ist der Mittelpunkt der Welt, also erwartet er, dass er in allen Texten auch im Zentrum steht.