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 und StringBuilder sicher nutzen können

  • API von String und StringBuilder sicher nutzen können

  • erkennen, wann String und StringBuilder 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:

  1. Schreibe eine neue Methode htmlElement(String tag, String body), die einen String body mit einem Start- und End-Tag tag einrahmt und als neuen String zurückgibt. Es gibt folgende Sonderbehandlung:

    • Ist tag gleich null oder leer ("") so wird nur der body betrachtet und keine Start-End-Tags geschrieben.

    • Ist body gleich null, so gilt das wie ein übergebener Leer-String.

  2. Schreibe zwei neue Methoden strong(String) und emphasized(String), die im Hintergrund mit htmlElement(…​) 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.

Check safe transmission by doubling characters

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 Arrays-Klasse bietet binarySearch(…​), die in einem sortierten Array etwas sucht, und wenn die Methode das Element findet, die Fundstelle zurückgibt; falls binarySearch(…​) den Eintrag nicht findet, wird die negierte Position zurückgegeben, an der das Element eingefügt werden könnte.

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.

Swap Y and Z

Aufgabe:

  1. Lege eine neue Klasse YZswapper an.

  2. Setze in die Klasse eine neue Klassenmethode void printSwappedYZ(String string), die einen übergebenen String 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!

  3. 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 mit switch-case.

Beispiele:

  • printSwappedYZ("yootaxz") ergibt auf dem Bildschirm die Ausgabe zootaxy und

  • printSwappedYZ("Yanthoxzl") die Ausgabe Zanthoxyl.

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!«

Give defiant answers

Aufgabe:

  1. Lege eine neue Klasse an, und frage von der Kommandozeile eine Eingabe ab.

  2. 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.

PalindromeTester

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 Methode isPalindromeIgnoringNonLettersAndDigits(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.