3 Sprachelemente und Anweisungen Strings (Zeichenketten) Java HS Merseburg (FH) WS 06/07 3 Sprachelemente und Anweisungen ZK sind Objekte der Klasse String, d. h. sie besitzen Methoden und Attribute. ZK sind nur lesbar und nicht veränderbar. Veränderungen können nur über die Klasse StringBuffer vorgenommen werden. Die Instanzierung von Zeichenketten erfolgt durch · „Zeichenkette“ · durch + bzw. += auf 2 Objekte der Klasse String · new String() „„ · new String(String value) Zwei grundlegende Methoden der Klasse ZK sind length() und charAt(). length() gibt Anzahl der Zeichen zurück (organisiert als Array) und ermöglicht so den Zugriff auf Elemente zwischen 0 oder und length()-1 (IndexOutOfBoundsException) Java HS Merseburg (FH) WS 06/07 3 Sprachelemente und Anweisungen class StringAnalyse { public static void main(String args[]){ System.out.println("Beispiel StringAnalyse"); Eingabe strein = new Eingabe(); String str = strein.EingabeEinesString("Satz: (>40 Zeichen: "); System.out.println("Der String lautet: " + str); System.out.println("String-Länge:" + str.length()+ "Zeichen."); //Zählung beginnt bei 0 System.out.println("Zeichen an Position 16 ist ein \"" + str.charAt(16) + "\n""); //Meth. startswith() und endswith() gibt Boolean-Wert zurück System.out.println("Der String beginnt mit dem Wort \"Leben\": " + str.startsWith("Leben")); Java HS Merseburg (FH) WS 06/07 3 Sprachelemente und Anweisungen Mögliche Bildschirmausschrift: Beispiel StringAnalyse Geben Sie einen Satz ein (>40 Zeichen): Traeume nicht Leben, sondern lebe Deine Traeume! Dein Der String lautet: Traeume nicht Dein Leben, sondern lebe Deine Traeume! Die Das Der Der Der Der Der Der Der String-Laenge betraegt 53 Zeichen. Zeichen an Position 16 ist ein "i" String beginnt mit dem Wort "Leben": false String endet mit dem Wort "Träume!": false Index des ersten "L" ist 19 Index des letzten "L" ist: 34 Substring von Position 0 bis 2 ist Tra Substring von Position 10 bis 20 ist: cht Dein L Substring von Position 40 bis zum Ende ist: eine Traeume! Press RETURN for exit ... Java HS Merseburg (FH) WS 06/07 3 Sprachelemente und Anweisungen Strings sind nur lesbar und nicht veränderbar !!! Java HS Merseburg (FH) WS 06/07 3 Sprachelemente und Anweisungen class ChangeString { public static void main(String args[]) throws IOException String aStr = "Geed "; String bStr = "Merning!"; String cStr = aStr.concat(bStr); System.out.println(cStr); String aStr = aStr.concat(bStr); System.out.println(aStr.concat(bStr)); { // das geht nicht // aber das geht String dStr = cStr.replace('e', 'o'); System.out.println(dStr); String eStr = dStr.toLowerCase(); System.out.println(eStr); String fStr = eStr.toUpperCase(); System.out.println(fStr); .... } Java HS Merseburg (FH) WS 06/07 // Kleinbuchstaben 3 Sprachelemente und Anweisungen Bildschirmausschrift: Geed Merning! Geed Merning! Good Morning! good morning! GOOD MORNING! ..... Problem: Bei Zeichenketten in Ausdrücken wird für Zwischenergebnis eine gesonderte String-Instanz benötigt. jedes Lösung: Benutzung eines Objektes der Klasse StringBuffer für ZK in Ausdrücken. StringBuffer Objekte können verändert werden und sind unabhängig von String. Java HS Merseburg (FH) WS 06/07 3 Sprachelemente und Anweisungen class ChangeBuffer { public static void main(String args[]) throws IOException { StringBuffer aBuff = new StringBuffer("Aller ist im Fluss!"); System.out.println("Inhalt von aBuff: " + aBuff); // Methode zur Manipulation der Pufferlänge aBuff.setLength(10); System.out.println("aBuff.setLenght(10) ausgeführt:"); System.out.println("Neuer Inhalt von aBuff: " + aBuff); // Methode zur Manipulation des Pufferinhaltes aBuff.setCharAt(4,'s'); System.out.println("aBuff.setCharAt(4,'s') ausgeführt:"); System.out.println("Neuer Inhalt von aBuff: " + aBuff); .... Java HS Merseburg (FH) WS 06/07 3 Sprachelemente und Anweisungen Ausschrift: Inhalt von aBuff: Aller ist im Fluss! aBuff.setLenght(10) wurde ausgefuehrt: Neuer Inhalt von aBuff: Aller ist Kapazitaet und Laenge: 35Zeichen, 10Zeichen aBuff.setCharAt(4, 's') wurde ausgefuehrt: Neuer Inhalt von aBuff: Alles ist Java HS Merseburg (FH) WS 06/07 3 Sprachelemente und Anweisungen Kapazität StringBuffer hat eine Kapazität der Länge der ZK, die noch gespeichert werden kann bevor mehr Platz angefordert wird. Der Puffer wächst zwar automatisch, aber die einmalige Größenangabe ist effizienter. Vergleiche von Strings Die internationalen Aspekte von Zeichen werden bei der Sortierung nicht berücksichtigt. Der Ausgangspunkt für Vergleiche ist der Unicode: bsp: 1. aça und 2.acz //ç(\u0E7)und c(\u063)im Alph. gleich, nicht // Sortierung: 1. acz und 2. aça Java HS Merseburg (FH) WS 06/07 Unicode 3 Sprachelemente und Anweisungen String.equals(String str) liefert true wenn die übergebene Objektreferenz auf ein Objekt mit gleichem Inhalt zeigt (gleiche Länge und gleiche Unicodezeichefolge). String.equalsIgnoreCase(String str) unabhängig von Groß-/Kleinschreibung ist ein ZK-Vergleich int String.compareTo(String str) ergibt ein negatives Ergebnis wenn str kleiner, 0 wenn gleich, und positiv wenn größer. Ist zur Sortierung von ZK geeignet. Beispiel: binärer Suchalgorithmus auf sortiertes Array Java HS Merseburg (FH) WS 06/07 3 Sprachelemente und Anweisungen private String[] feld; public int position (String str) { int lo = 0; int hi = feld.length - 1; while (lo <= hi) { int mid = lo + (hi -lo) / 2; int cmp = str.compareTo(feld[mid]); if (cmp == 0) //gefunden return mid; else if (cmp < 0) // im unteren Bereich suchen hi = mid - 1; else lo = mid + 1; } return -1; // nicht gefunden } Java HS Merseburg (FH) WS 06/07 3 Sprachelemente und Anweisungen Zeichenkettenumwandlung Der Typ zu dem gewandelt wird, sollte eine Methode zur Umwandlung besitzen. Typ nach String boolean String.valueOf(boolean) new Boolean(String).booleanValue() int String.valueOf(int) float String.valueOf(float) etc... Java von String Integer.ParseInt(String, int base) new Float(String).floatValue() HS Merseburg (FH) WS 06/07 3 Sprachelemente und Anweisungen String Übung: Ziel: • Zugriff auf die Stringkomponenten und Auswertung • Zählen der Häufigkeit eines Buchstabens: public class ZeichenZaehler { public static void main (String args[]) { String str = new String ("Java ist eine Sprache."); long zeichenZaehler[] = new long [256]; // 65536 for (int i = 0; i < str.length(); i++) zeichenZaehler[str.charAt(i)] ++; for (int i = 0; i < zeichenZaehler.length; i++) if (zeichenZaehler[i] > 0) System.out.println((char)(i) + "\t[" + i + "]\t- " + zeichenZaehler[i] + " mal"); } } Java HS Merseburg (FH) WS 06/07