Übung Softwareentwicklung 1 für Wirtschaftsinformatik Strings Dipl.-Ing. Kerstin Altmanninger Wintersemester 2008/2009 Mittwoch, 10.12.2008 Überblick • • • • • Stringkonstanten Datentyp String Stringvergleiche Stringoperationen Aufbau von Strings – Erzeugung von Strings aus einer Stringkonstanten – Erzeugung von Strings aus einem char-Array – Erzeugung von Strings aus einem StringBuffer • • Stringkonversionen Beispiele 2/18 SWE1 Übung DI Kerstin Altmanninger Stringkonstanten • Zeichenfolgen zwischen doppelten Hochkommas • Dürfen nicht über Zeilengrenzen gehen • Falls Zeichen enthalten sein sollen, die am Bildschirm nicht darstellbar sind → mit Escape-Sequenzen ausdrücken – Beginnen alle mit dem Escape Zeichen \ – Dürfen in Zeichen- und Zeichenkettenkonstanten vorkommen neue Zeile (LF) – Beispiele: '\n' '\r' '\t' '\\' '\'' • return (CR) Tabulatorsprung Backslash einfaches Anfuehrungszeichen Beispiele für Stringkonstanten: System.out.println("s string of many words"); System.out.println("Alice\t2000\nBob\t1980"); System.out.println("containing a \" character"); System.out.println("EURO symbol: \u20ac"); Output 3/18 SWE1 Übung DI Kerstin Altmanninger Datentyp String (1/2) • Stringvariablen enhalten Zeiger auf Stringobjekte, nicht Stringobjekte selbst • Beispiel: String a, b; //Deklaration a = "Hello"; b = a; a Hello b • Stringobjekte sind NICHT veränderbar! • Beispiel: a = a+" World"; //neues Stringobjekt wird erzeugt! a Hello World b Hello 4/18 SWE1 Übung DI Kerstin Altmanninger Datentyp String (2/2) • String hat besondere Unterstützung durch den Compiler – Compiler kennt den Typ String, obwohl dieser eigentlich nicht in der Sprache, sondern in der Bibliothek definiert wurde – Compiler unterstützt den Verkettungsoperator + (falls einer der Operanden nicht vom Typ String ist, wird dieser Operand voher automatisch in eine Stringdarstellung umgewandelt) – Beispiel: boolean b = true; String s = "word"+47+"="+b; s word47 = true 5/18 SWE1 Übung DI Kerstin Altmanninger Stringvergleiche • • Zeigervergleich: Wertevergleich: • Beispiel 1: a == b a.equals(b) a String a = "Hello"; String b = a; boolean zeigervergleich = a == b; //true boolean wertevergleich = a.equals(b); //true • • Hello b Beispiel 2: a String a = "Hello"; String b = new String(a); //Kopie boolean zeigervergleich = a == b; //false boolean wertevergleich = a.equals(b); //true b Beispiel 3: a String a = "Hello"; String b = "Hello"; boolean zeigervergleich = a == b; Hello Hello Hello //true b 6/18 SWE1 Übung DI Kerstin Altmanninger Stringoperationen (1/2) Überblick über die wichtigsten String Operationen der Java Bibliothek: • int number = str.length(); liefert die Anzahl der Zeichen in dem String str • char ch = str.charAt(3); liefert das Zeichen mit dem Index 3 aus dem String str • int index = str.indexOf("ng"); liefert die Position des ersten Vorkommens von „ng“ in str oder -1 falls das Suchmuster nicht vorkommt • int index = str.indexOf("ng", 5); liefert die Position des erstens Vorkommens von „ng“ in str, beginnt mit der Suche aber erst ab Position 5 • int index = str.lastIndexOf("ng"); liefert die Position des letzten Vorkommens von „ng“ in str 7/18 SWE1 Übung DI Kerstin Altmanninger Stringoperationen (2/2) Überblick über die wichtigsten String Operationen der Java Bibliothek: • String str2 = str.substring(2); liefert den Teilstring von str ab der Position 2 • String str2 = str.substring(2, 6); liefert den Teilstring von s ab der Position 2 und bis (ausschließlich) Position 6 • if (str.startsWith("abc")) ... liefert true, wenn str mit „abc“ beginnt • if (str.endsWith("abc")) ... liefert true, wenn str mit „abc“ endet 8/18 SWE1 Übung DI Kerstin Altmanninger Aufbau eines Strings (1/4) • String-Objekte sind konstant und eignen sich daher nicht zum schrittweisen Aufbau einer Zeichenkette • Daher wir ein String entweder a) In seiner endgültigen Form erzeugt oder b) In einem char-Array bzw. c) In einem StringBuffer-Objekt aufgebaut und anschließend in ein String-Objekt umgewandelt a) Erzeugung eines Strings aus einer Stringkonstante: String str = "very simple" 9/18 SWE1 Übung DI Kerstin Altmanninger Aufbau eines Strings (2/4) b) Erzeugung von Strings aus einem char-Array: – Schritt 1: String in char-Array zusammensetzen – Schritt 2: char-Array in String umwandeln char[] a = new char[80]; //Einlesen der Zeichen fuer das char-Array for (int i=0; i<80; i++) a[i] = IO.read(); //String-Objekt enhaelt eine Kopie der Zeichen in a String str = new String(a); //String-Objekt enhaelt eine Kopie der Zeichen von Index 2 bis 6 von a String str2 = new String(a,2,7); 10/18 SWE1 Übung DI Kerstin Altmanninger Aufbau eines Strings (3/4) c) Erzeugung von Strings aus einem StringBuffer: – – – StringBuffer verhält sich in vielen Dingen wie String Kann aber editiert werden Erzeugung eines leeren StringBuffer-Objektes: StringBuffer strB = new StringBuffer(); Wichtigste StringBuffer Operationen: • Int number = strB.length(); Liefert die Anzahl der Zeichen in strB • strB.append(x); hängt x and strB an (x kann vom Typ char, int, long, float, double, boolean, String und char[] sein • strB.insert(pos,x); fügt x an der Stelle pos in b ein 11/18 SWE1 Übung DI Kerstin Altmanninger Aufbau eines Strings (4/4) Wichtigste StringBuffer Operationen: • strB.delete(from,to); löscht die Zeichen von Position from (inclusive) bis Position to (exklusive) aus strB • strB.replace(from,to,"abc"); ersetzt einen Teil von strB durch "abc" • String str = strB.substring(from,to); liefert einen Teil von strB als String • Char ch = strB.charAt(i); liefert das Zeichen mit Index i aus strB • strB.setChar(i,'x'); ersetzt das Zeichen mit Index i in strB durch 'x' • String str = strB.toString(); liefert einen String mit demselben Inhalt wie der StringBuffer strB 12/18 SWE1 Übung DI Kerstin Altmanninger Stringkonversionen • Manchmal ist es nötig, Werte verschiedener Typen (int, float, char[]) in einen String umzuwandeln • Java Bibilothek bietet dafür geeignete Operationen – Erzeugung einer Ziffernfolge in eine int-Zahl: Int i = Integer.parseInt("123"); – Erzeugung einer Ziffernfolge in eine float-Zahl: float f = Float.parseFloat("3.14"); – Erzeugung eines char-Array mit demselben Inhalt des Strings: char[] a = s.toCharArray(); – Erzeugung eines Wert x in einen String: (x kann vom Typ char, int, long, float, double, boolean oder char[] sein) String s = String.valueOf(x); Î Für die Ausgabe einer Folge von Werten als String ist es jedoch bequemer den + Operator zu verwenden (konvertiert den Wert automatisch in einen String) 13/18 SWE1 Übung DI Kerstin Altmanninger Beispiel 1: Palindrombestimmung (1/2) • • • • Gegeben ist eine Liste text die einen Text in Form von Einzelzeichen beinhaltet. Schreiben Sie eine Methode, die bestimmt, ob eine vorliegende Liste ein Palindrom (von Rückwärts gelesen genauso wie von vorne) darstellt. Der Rueckgabewert der Methode soll dementsprechend entweder true oder false sein. Parameter: char[] text = {'D','I','E','N','S','T','M','A','N', 'N','A','M','T','S','N','E','I','D'}; public static boolean palindrom(char[] text) { for (int i=0; i<(int)(text.length/2); i++) { if (text[i] != text[(text.length-i-1)]) { return false; // character does not match: no palindrom! } } return true; // palindrom found } // end method palindrom • Parameter (NEU): String text = "DIENSTMANNAMTSNEID"; 14/18 SWE1 Übung DI Kerstin Altmanninger Beispiel 1: Palindrombestimmung (2/2) Parameter (NEU): String text = "DIENSTMANNAMTSNEID"; public static boolean palindrom(String text) { for (int i=0; i<(int)(text.length()/2); i++) { if (text.charAt(i) != text.charAt(text.length()-i-1)) { return false; // character does not match: no palindrom! } } return true; // palindrom found } // end method palindrom 15/18 SWE1 Übung DI Kerstin Altmanninger Beispiel 2: Manipulation von Dateipfaden (1/2) • Ein Dateipfad besteht aus der Angabe von Verzeichnissen und dem eigentlichen Dateinamen, z.B. Lecture\JavaProgs\Prog5.java • Eine der Aufgaben des Java-Compilers ist es, aus einem solchen Dateipfad den Dateinamen herauszulösen und die Endung ".java" auf ".class" zu ändern • Die Funktion className(path) soll diese Aufgabe mit Hilfe der StringBuffer-Operationen lösen • Der Aufruf String str = className("Lecture\JavaProgs\Prog5.java"); soll somit die Stringkonstante „Prog5.class“ liefern • Falls der Methode kein Pfad zu einem Java File übergeben wurde soll die Fehlermeldung "Error: No Java file found" zurückgegeben werden 16/18 SWE1 Übung DI Kerstin Altmanninger Beispiel 2: Manipulation von Dateipfaden (2/2) public static String className(String path) { //Creates a StringBuffer containing the path StringBuffer b = new StringBuffer(path); //if the path directs to a java file if (path.endsWith(".java")) { int len = path.length(); b.replace(len-5, len, ".class"); int i = path.lastIndexOf('\\'); if (i>=0) b.delete(0, i+1); return b.toString(); } else { return "Error: No Java file found!"; } }//end method className 17/18 SWE1 Übung DI Kerstin Altmanninger Beispiel 3: Stringvergleich • Implementieren Sie eine Methode diff(s1,s2), die folgende Werte liefert: -1 0 1 wenn a < b wenn beide Strings (a und b) gleich sind wenn a > b static int diff(String a, String b) { int i = 0, j = 0; while (i<a.length() && j<b.length() && a.charAt(i)==b.charAt(j)) { i++; j++; } if (i == a.length() && j == b.length()) return 0; else if (i == a.length()) return -1; else if (j == b.length()) return 1; else if (a.charAt(i) < b.charAt(j)) return -1; else return 1; //if (a.charAt(i) > b.charAt(j)) }//end method diff 18/18 SWE1 Übung DI Kerstin Altmanninger