140 likes | 234 Views
Strings (Zeichenketten). 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
E N D
Strings (Zeichenketten) HS Merseburg (FH) WS 06/07
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) HS Merseburg (FH) WS 06/07
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")); HS Merseburg (FH) WS 06/07
Mögliche Bildschirmausschrift: Beispiel StringAnalyse Geben Sie einen Satz ein (>40 Zeichen): Traeume nicht Dein Leben, sondern lebe Deine Traeume! Der String lautet: Traeume nicht Dein Leben, sondern lebe Deine Traeume! Die String-Laenge betraegt 53 Zeichen. Das Zeichen an Position 16 ist ein "i" Der String beginnt mit dem Wort "Leben": false Der String endet mit dem Wort "Träume!": false Der Index des ersten "L" ist 19 Der Index des letzten "L" ist: 34 Der Substring von Position 0 bis 2 ist Tra Der Substring von Position 10 bis 20 ist: cht Dein L Der Substring von Position 40 bis zum Ende ist: eine Traeume! Press RETURN for exit ... HS Merseburg (FH) WS 06/07
Strings sind nur lesbar und nicht veränderbar !!! HS Merseburg (FH) WS 06/07
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); // das geht nicht System.out.println(aStr.concat(bStr)); // aber das geht String dStr = cStr.replace('e', 'o'); System.out.println(dStr); String eStr = dStr.toLowerCase(); // Kleinbuchstaben System.out.println(eStr); String fStr = eStr.toUpperCase(); System.out.println(fStr); .... } HS Merseburg (FH) WS 06/07
Bildschirmausschrift: Geed Merning! Geed Merning! Good Morning! good morning! GOOD MORNING! ..... Problem: Bei Zeichenketten in Ausdrücken wird für jedes Zwischenergebnis eine gesonderte String-Instanz benötigt. 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. HS Merseburg (FH) WS 06/07
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); .... HS Merseburg (FH) WS 06/07
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 HS Merseburg (FH) WS 06/07
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 Unicode // Sortierung: 1. acz und 2. aça HS Merseburg (FH) WS 06/07
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) ist ein ZK-Vergleich unabhängig von Groß-/Kleinschreibung 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 HS Merseburg (FH) WS 06/07
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 } HS Merseburg (FH) WS 06/07
Zeichenkettenumwandlung Der Typ zu dem gewandelt wird, sollte eine Methode zur Umwandlung besitzen. Typ nach String von String boolean String.valueOf(boolean) new Boolean(String).booleanValue() int String.valueOf(int) Integer.ParseInt(String, int base) float String.valueOf(float) new Float(String).floatValue() etc... HS Merseburg (FH) WS 06/07
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"); • } • } HS Merseburg (FH) WS 06/07