Zeichenkettenverarbeitung

Strings

Zugriff auf bestimmte Zeichen

Schreibe eine Klassenmethode void speekLikeAChinese(String s), die einen übergebenen java.lang.String auf dem Bildschirm bringt, aber den Buchstaben "r"/"R" als "l"/"L" ausgibt.

Lösung

Vokale entfernen

Sprachwissenschaftler sind der Ansicht, dass auch nach dem Entfernen von Vokalen der Text noch lesbar bleibt. Schreibe eine Klassenmethode String removeVowels(String s), die aus einem java.lang.String s die Vokale entfernt. Stimmt es, was die Wissenschaftler sagen?

Lösung

Quersumme *

Die Quersumme einer Zahl bildet man durch die Addition jeder Ziffer der Zahl. Wenn die Zahl etwa 10938 lautet, so ist die Quersumme 1+0+9+3+8 = 21.

Lösung

Ausgabe im Morse-Code *

Ein Morse-Funkspruch besteht aus kurzen und langen Symbolen, die mit . und - angedeutet sind. Jeder Buchstabe ist durch ein Leerzeichen getrennt. Kopiere die folgende Definition in ein Programm, welches eine Zeichenkette in das Morse-Alphabet umsetzt.

// A .-      N -.      0 -----
// B -...    O ---     1 .----
// C -.-.    P .--.    2 ..---
// D -..     Q --.-    3 ...--
// E .       R .-.     4 ....-
// F ..-.    S ...     5 .....
// G --.     T -       6 -....
// H ....    U ..-     7 --...
// I ..      V ...-    8 ---..
// J .---    W .--     9 ----.
// K -.-     X -..- 
// L .-..    Y -.-- 
// M --      Z --..

Nicht bekannte Zeichen sollen übersprungen werden.

Lösung

Die Cäsar-Verschlüsselung *

Bei der so genannten Cäsar-Verschlüsselung verschiebt man jedes Zeichen um vier Positionen im Alphabet, das heißt, aus A wird D, aus B wird E und so weiter. Am Ende des Alphabets beginnen wir wieder von vorne und so ergibt X->A, Y->B,Z->C.

Implementiere eine Methode String caesar(String s, int rotation), die die Verschlüsselung vornimmt, und String decaesar(String s, int rotation), die sie wieder zurücknimmt. rotation ist dabei die Verschiebung, die beliebig sein sollte, nicht nur 4.

Lösung

Römische Zahlen in Dezimalzahlen umwandeln **

Eine Klassenmethode roman2Decimal(String s) soll eine Zeichenkette s vom römischen Zahlensystem ins dezimale übersetzen. Die Zahlzeichen mit der Bedeutung sind:

M = 1000D = 500C = 100L = 50
X = 10V = 5I = 1 

Text-Abkürzer *

Ist auf dem Bildschirm für einen ganzen Text nicht mehr viel Platz, so wird der Text gerne mit ... abgekürzt. Wir finden diese Punkte zum Beispiel im Explorer oder im E-Mail-Programm.

Wörter unterstreichen *

Eine Klassenmethode printUnderline(String s, String underline) soll die Zeichenkette underline in s unterstreichen. Dazu sollen zwei Ausgabezeilen aufgebaut werden, etwa so:

Man wird nicht dadurch besser, dass man andere schlecht macht.
                       ------

Lösung

Wörter raten *

Aus einem Wörterbuch soll ein Computer per Zufall ein Wort auswählen. Wir sollen dieses Wort erraten und dürfen pro Runde genau einen Buchstaben wählen.

Frequenzkonvertierung *

  1. Schreibe eine Methode String onlyNumbers(String), die aus einem beliebigen String nur Zahlen, +, - und Dezimaltrenner (also . und ,) zurückgibt. Beispiel onlyNumbers("ABC 12,324 ZB") ergibt "12,324".
  2. Schreibe eine neue Methode double stringDoubleToDouble(String), die eine Zeichenkette in ein double konvertiert. Als Dezimaltrenner sind , und auch . erlaubt.
  3. Nutze die neue Methode um double toFrequence(String) so zu implemtieren, dass  toFrequence("12,3 Mhz") das Ergebnis 12.3 vom Typ double liefert.

Lösung

Der Palindrom-Test *

Schreibe ein Java-Programm, welches untersucht, ob die als Kommandozeilen-Argumente angegebenen Wörter Palindrome sind. Ein Palindrom ist ein Wort, das sich von vorne wie von hinten gleich liest, etwa Otto oder auch 121.

Einfaches Pattern Matching **

Peter Pan sucht eine Methode zum Pattern Matching. Sie soll, ähnlich wie strstr(...) in C, in einem String nach einem Suchstring suchen. Der Suchstring soll dabei aber "*" (Ersatz für mehrere Zeichen) sowie "?" enthalten. Nun erhält er eine Lösung, doch leider in C. :-( Wer kann Peter Pan helfen?

Dynamische Strings mit StringBuilder/StringBuffer

Leerzeichenkomprimierer *

Schreibe eine Klassenmethode StringBuilder compressSpace(StringBuilder sb), die mehr als zwei Leerzeichen in dem übergebenen java.lang.StringBuilder zu einem Leerzeichen zusammenschmilzen lässt. Die Übergabe sb soll mit return sb; zurückgegeben werden, die Veränderung soll direkt am StringBuilder erfolgen.

Lösung

Knack

Meldungen über Funk haben oft ein Knacksen. Simuliere dies, in dem in einem beliebigen String in willkürlichen Abständen "♬KNACK♪" eingebaut wird.

Schreibe einen passenden "Entknacker", der den String wieder vom Knacken befreit.

Lösung

Einfache Zerlegung von Zeichenketten, Tokenizer

Die längste Zeile einer Datei

Laufe mit einem java.util.Scanner durch eine Datei und gib Länge der längsten Zeile aus.

Lösung

StringTokenizer *

Schreibe eine Klasse WordWrapper mit einer statischen Methode String wrapWord(String s, int len), die eine Zeichenkette s in kleine Teilzeichenketten der Länge len zerlegt und mit Return getrennt wieder zurückgibt. Mit einem String

"Der Sehnsucht entgegen, sie erleben. Wer kann das schon. Den Träumen entgegen, " +
"sie erleben. Wer macht das schon. Den Gefühlen entgegen, sie erleben. Wer wagt das schon. " +
"Der Liebe entgegen, sie erleben. Wer darf das schon."

wird zum Beispiel bei einer Zeilenlänge von 20 folgender String zurückgegeben:

Der Sehnsucht
entgegen, sie
erleben. Wer kann
das schon. Den
Träumen entgegen,
sie erleben. Wer
macht das schon.
Den Gefühlen entgegen,
sie erleben. Wer
wagt das schon. Der
Liebe entgegen, sie
erleben. Wer darf
das schon.

Lösung

Reguläre Ausdrücke und Mustererkennung

String#split(...)

Gegeben ist ein String wie

String s = "Hallöchen Welt! Toll".

Ein regulärer Ausdruck soll nun bei Strings-Methode split(...) alle Wörter liefern, in unserem Fall ein Array mit "Hallöchen", "Welt", "Toll". Leerzeichen, Satzzeichen und alles was kein Buchstabe oder Umlaut [äöüßÄÜÖ] ist, soll rausfallen.

Teste später das Programm mit beliebigen Benutzereingaben, die von einem Dialog stammen: String input = javax.swing.JOptionPane.showInputDialog("Bitte String eingeben");

Zahlen lesen

Gegeben ist in englischer Satz mit Zahlen, etwa "99 bottles of beer makes me happy for 10 years". Alle Zahlen sollen nur "ausgespochen" werden, also "99" als ninety-nine, "10" als ten und in den Text eingebaut werden, also als "ninety-nine bottles of beer makes me happy for ten years". Eine Methode zum "Vorlesen" gibt es bei Stack Overflow.

Lösung

Pig-Latin-Konverter ***

Die Pattern/Matcher erlauben nicht nur das Suchen und Ersetzen, sondern bieten noch weitere interessante Möglichkeiten. Interessant vom Matcher sind die Methoden appendReplacement(...) und appendTail(...). Evaluiere, ob man einen http://en.wikipedia.org/wiki/Pig_Latin-Konverter mit diesen speziellen Methoden einfach schreiben kann.

Strings formatieren

Die Klasse Formatter (10 Minuten)

Sei

double d = 1234567.1234;
Calendar c = Calendar.getInstance();

Wie erhält man die Ausgaben

1234567,12
1.234.567,12
    1.234.567,12  (rechtsbündig auf der Breite von 20 Stellen)  

und den Tag/Monat/Jahr (etwa 11/12/2015) des Kalenders?

Lösung

Die Klasse Formatter

Wirf einen Blick auf die Dokumentation der Klasse Formatter. Erzeuge eine Datei und schreibe dort das aktuelle Datum hinein. Für die Aufgabe müssen zwei bis drei Anweisungen reichen.

Teste das Schreiben auch mit unserer neuen Klasse, die ein StringBuilder als Appendable nutzt.

Klasse java.text.DecimalFormat *

Analysiere nachfolgendes Programmsegment:

double d = 12345.67890;
DecimalFormat df = new DecimalFormat( "###,##0.00" );
System.out.println( df.format(d) );

Was macht die Klasse java.text.DecimalFormat? Welche Formatierungsanweisungen sind erlaubt? Stelle eine Tabelle zusammen und belege die Formatierungen mit einem Beispiel. Die Klasse java.text.DecimalFormat existiert nicht alleine für die Formatierung. Es gibt noch einige "Verwandte". Welche sind das? Nenne Aufgabenbereiche, Unterschiede und Gemeinsamkeiten.

File-Zugriff mit Scanner

Namenslänge ausgeben

Die Datei Family-Names enthält Familiennamen. Speichere die Datei auf dem eigenen Dateisystem. Lies die Datei mit Hilfe der Klasse java.util.Scanner ein und gib die Zeilen auf dem Bildschirm aus.

Lösung