====== Strings (Zeichenketten) ====== ===== Deklaration von Zeichenketten ===== Jede Zeichenkette ist eigentlich ein [[http://java.sun.com/javase/6/docs/api/java/lang/String.html|Objekt vom Typ String]]. Zur Verarbeitung von Zeichenketten stehen daher Instanzvariable oder Methoden der Klasse String zur Verfügung. Da die Klasse String in der Bibliothek java.lang definiert ist, steht sie allen Java-Programmen zur Verfügung. String s = new String(); erzeugt eine leere Zeichenkette. ==== Zeichenketten initialisieren ==== Im obigen Beispiel wurde genaugenommen der Standardkonstruktor für die Klasse String verwendet. Ein String wird durch die Angabe einer Zeichenkette initialisiert. String s = new String("Informatik ist schön!"); ==== Initialisierung durch char-Arrays ==== Zur Klasse String existiert ein Konstruktor, der Arrays in die Zeichenkette überträgt: public class string2 { public static void main(String [] args) { char text[] = {'I','n','f','o','r','m','a','t','i','k'}; String s = new String(text); System.out.println(s); } } Wir erhalten die Ausgabe ''Informatik'' Durch die Angabe des Index und der Anzahl der Zeichen werden die Zeichen teilweise aus dem Array übernommen: public class string2 { public static void main(String [] args) { char text[] = {'I','n','f','o','r','m','a','t','i','k'}; String s = new String(text,2,4); System.out.println(s); } } Damit erhalten wir erwartungsgemäß ''form'' ==== Initialisierung durch byte - Array ==== Auch byte - Arrays können zur Initialisierung einer Zeichenkette übergeben werden: public class string3 { public static void main(String [] args) { byte text[] = {73, 78, 70, 79}; String s = new String(text); System.out.println(s); } } Wir erhalten: ''INFO'' Bei diesem Konstruktor kann ebenfalls der Startindex und die Anzahl der ausgelesenen Bytes angegeben werden. [[http://goascii.com/|ASCII-Tabelle]] ===== String - Methoden ===== Für die Klasse [[http://java.sun.com/javase/6/docs/api/java/lang/String.html#method_summary|string existieren zahlreiche Methoden]] zur Handhabung der Zeichenketten. Die wichtigsten davon sollen in diesem Abschnitt vorgestellt werden. ==== Länge einer Zeichenkette ermitteln ==== **int length()** public class string4 { public static void main(String [] args) { String s = new String("Informatik ist schön"); System.out.println(s.length()); } } ==== Ein bestimmtes Zeichen einer Zeichenkette ausgeben ==== **charAt (int Position)** public class string4 { public static void main(String [] args) { String s = new String("Informatik ist schön"); for (int i=0; i < s.length(); i++) { System.out.print(s.charAt(i)); } } } ==== Weitere wichtige String-Methoden ==== **getChars()** Einzelne Zeichen auslesen. Während mit ''charAt()'' ein einzelnes Zeichen mit dem angegebenen Index ausgewählt wird, erlaubt ''getChars(int start, int ende, char ergebnis[], int start_ergebnis)'' die Auswahl einer zusammenhängenden Zeichenkette, die die Zeichen von ''start'' bis ''ende'' enthält. Das Ergebnis wird in den Array ergebnis, beginnend mit dem Index ''start_ergebnis'' geschrieben. **indexOf()** Die Position eines Zeichens (bzw. Zeichenkette) bestimmen. Die Methode indexOf gibt dabei das erste Auftreten dieses Zeichens (bzw. Zeichenkette) zurück. **substring()** Eine Teilzeichenkette ermitteln. Die Zeichenkette wird entweder mit Hilfe eines einzigen Index (''Startindex'') oder an Hand zweier Indizes (''Startindex'', ''Endindex'') bestimmt. **replace()** In der ganzen Zeichenkette ein bestimmtes Zeichen durch ein anderes ersetzen. ''replace(char original, char neu)'' ersetzt alle Zeichen ''original'' durch Zeichen ''neu''. **trim()** Liefert die Zeichenkette zurück, die vorangehende und abschließende nicht druckbare Zeichen entfernt. ===== Operatoren für Zeichenketten ===== ==== Verkettung von Zeichenketten ==== Zeichenketten werden entweder mit dem binären Operator ''+'' oder mit der Methode ''concat()'' verkettet. public class string5 { public static void main(String [] args) { String s1 = new String("Informatik"); String s2 = new String("ist"); String s3 = new String("schön"); String nl = new String(" "); System.out.println(s1 + nl + s2 + nl + s3 + "!"); System.out.println(s2.concat(nl).concat(s1).concat(nl).concat(s3).concat("?")); } } Beachte, wie in der letzten Zeile die String-Methode ''concat()'' jeweils auf die bereits erhaltene Zeichenkette angewendet wird! ==== Ausgeben von Zeichenketten und Variablenwerten ==== Wird eine Zeichenkette mit einem Variablennamen verkettet, so wird zunächst der Zeichenkettenwert der Variablen ermittelt. Dieser wird mit der schon angegebenen Zeichenkette verkettet. public class string6 { public static void main(String [] args) { int a = 10; int b = 20; System.out.println(a + " + " + b + " = " + a + b); System.out.println(a + " + " + b + " = " + (a + b)); } } Beachte die Verwendung von Gruppierungsklammern! Jedenfalls entsteht der folgende Output: 10 + 20 = 1020 10 + 20 = 30 ==== Der Vergleich von Zeichenketten ==== Der Vergleich von Zeichenketten spielt beispielsweise für die Programmsteuerung oder für datenbankähnliche Anwendungen eine Rolle. Da die Variablennamen für Zeichenketten aber die Adresse enthalten, können einfache Vergleichsoperatoren wie ''=='' oder ''!='' nicht verwendet werden. An ihre Stelle treten bestimmte String-Methoden. Warum liefert der folgende Vergleich den Boole'schen Wert false? public class string7 { public static void main(String [] args) { String s = new String("hallo"); System.out.println("hallo" == s); } } liefert ''false'' ==== Die Methode equals() ==== Das folgende Beispiel zeigt einen korrekten Vergleich von Zeichenketten: public class string8 { public static void main(String [] args) { String s = new String("hallo"); System.out.println(s.equals("hallo")); } } liefert "wunschgemäß" ''true'' Die Methode ''equals()'' liefert jedenfalls Boole'sche Werte zurück. ==== Weitere Vergleichsmethoden für Zeichenketten ==== Je nach Anwendung werden verschiedene, leistungsfähige Vergleichsmethoden verwendet. Einige davon werden hier angeführt: **equalsIgnoreCase()** Beim Zeichenkettenvergleich wird die Groß/Kleinschreibung ignoriert. Das Ergebnis ist ein Boole'scher Wert. **startsWith()** Stellt fest, ob eine Zeichenkette mit einer bestimten Zeichenfolge beginnt. Das Ergebnis ist ein Boole'scher Wert. **endsWith()** Stellt fest, ob eine Zeichenkette mit einer bestimten Zeichenfolge endet. Das Ergebnis ist ein Boole'scher Wert. **compareTo()** Überprüft neben der Gleichheit der Zeichenketten die alphabetische Abhängigkeiten (vgl. Wörterbuch). Das Ergebnis ist eine ganze Zahl: Steht die aufrufende Zeichenfolge im Wörterbuch vor der angegebenen, so liefert compareTo() eine negative Zahl; bei Gleichheit Null. Steht die aufrufende Zeichenkette im Wörterbuch nach der angegebenen, so ist das Ergebnis eine positive Zahl. public class string9 { public static void main(String [] args) { String s = new String("hallo"); System.out.println("hallo: " + s.compareTo("hallo")); System.out.println("ha: " + s.compareTo("ha")); System.out.println("Hallo: " + s.compareTo("Hallo")); System.out.println("abc: " + s.compareTo("abc")); System.out.println("hallo - ist da jemand: " + s.compareTo("hallo - ist da jemand")); System.out.println("huch: " + s.compareTo("huch")); } } liefert die folgenden Ergebnisse: hallo: 0 ha: 3 Hallo: 32 abc: 7 hallo - ist da jemand: -16 huch: -20 ==== Eine Wörterliste sortieren (Bubble-Sort) ==== Das folgende kleine Programm sortiert die Wörter eines Satzes. Alle Wörter werden in ein Array eingetragen, dessen Werte anschließend auf ihre alphabetische Reihenfolge überprüft werden. Stimmt die Reihenfolge nicht, so werden die Werte einfach ausgetauscht... public class string10 { public static void main(String [] args) { String satz[] = {"informatik", "ist", "schön", "und", "lehrer", "lügen", "nicht"}; for (int i = 0; i < satz.length; i++) { for (int j = i+1; j < satz.length; j++) { if (satz[j].compareTo(satz[i]) < 0) { String wort = satz[i]; satz[i] = satz[j]; satz[j] = wort; } } System.out.println(satz[i]); } } } Im Beispiel erhalten wir folgende Ausgabe: informatik ist lehrer lügen nicht schön und ===== Die Klasse StringBuffer ===== Ein einmal erzeugtes String - Objekt kann im Nachhinein nicht mehr verändert werden. Für Anwendungen, die veränderbare Zeichenketten benötigen, wird die Klasse [[http://java.sun.com/javase/6/docs/api/java/lang/StringBuffer.html|StringBuffer]] verwendet. ==== Die Reihenfolge der Zeichen umkehren ==== public class string12 { public static void main(String [] args) { StringBuffer s = new StringBuffer("informatik"); System.out.println(s); s.reverse(); System.out.println(s); } } ergibt die folgenden Zeilen: informatik kitamrofni ==== Befehlszeilenargumente verwenden ==== Bestimmt erhebt sich schon längst die Frage, welche Rolle die Parameterliste der Hauptmethode ''main(String [] args)'' spielt. Wir überprüfen dies im nächsten Beispiel... public class string13 { public static void main(String [] args) { for (int i=0; i Damit erhalten wir folgende Ausgaben: alfred@duron:~/java/kurs> java string13 Informatik ist schön args[0]: Informatik args[1]: ist args[2]: schön alfred@duron:~/java/kurs> Es ist leicht zu erkennen, wie die ``auf der Kommandozeile'' eingegebenen Parameter mit Hilfe des Zeichenketten-Feldes aufgerufen und innerhalb der eigenen Klasse verwendet werden können.