Kurs OPR Objektorientierte Programmierung Lektion: 004-Mehrd.Array, Strings etc. Zürcher Hochschule für Angewandte Wissenschaften Mitglied der Fachhochschule Zürich Version 1.4 Inhaltsverzeichnis 1 2 3 Zweidimensionale Arrays 3 1.1 Ziele 3 1.2 Einführung 3 1.3 Zweidimensionale Arrays in Java 3 1.4 Deklaration und Erzeugung 4 1.5 Initialisierung 5 1.6 Umgang mit Array-Elementen 6 1.7 Übergabe von Arrays als Parameter 7 1.8 Beispielprogramm Umsatzzahlen 8 1.9 Aufgabe 12 1.10 Professionelles Programmieren 13 Aufzählungstypen 14 2.1 Ziele 14 2.2 Einführung 14 2.3 Enumerations 14 2.4 Professionelles Programmieren 17 Reguläre Ausdrücke und StringTokenizer 18 3.1 Ziele 18 3.2 Reguläre Ausdrücke 18 3.3 Klasse StringTokenizer 20 3.4 Professionelles Programmieren 20 Mehrd.Array, Strings etc.doc © 2010 InIT/ZHAW 2 1 Zweidimensionale Arrays 1.1 • • • • 1.2 • Ziele Sie können den internen Aufbau eines zweidimensionalen Arrrays in Java anhand einer Grafik erklären. Sie können zweidimensionale Arrays korrekt deklarieren. Sie können mit zweidimensionalen Arrays richtig umgehen (Initialisierung, Zuweisung, Parameterübergabe, Rückgabewert). Sie setzen zweidimensionale Arrays situationsgerecht ein. Einführung Beispiel: Umsatzzahlen eines Geschäftes mit 3 Filialen für eine Woche − Diese können als Tabelle dargestellt werden: Tag Montag Dienstag Mittwoch Donnerstag Freitag Samstag Sonntag Zürich 76 68 85 65 43 100 5 Bern 41 33 36 35 28 49 0 Basel 10 21 13 14 17 15 0 Filiale • • 1.3 − Jede Zeile entspricht den Umsatzzahlen einer Filiale für die ganze Woche. − Jede Spalte entspricht den Umsatzzahlen für einen Tag in den verschiedenen Filialen. − Gemeinsames Merkmal der Zahlen dieser Tabelle: Alle Einträge sind vom gleichen Datentyp. In Java gibt es dafür einen speziellen Datentyp: Æ den zweidimensionalen Array Zweidimensionale Arrays werden häufig gebraucht, z.B.: − allgemein Tabellen − Matrizenrechnung − Darstellung von Bildern − Schachbrett Zweidimensionale Arrays in Java • Wir wissen vom eindimensionalen Array: − Er stellt eine Sammlung von Elementen des gleichen Datentyps dar. − Diese Elemente können auch Objekte sein. − Arrays selber sind ebenfalls Objekte. − Die Elemente eines Arrays können selbst auch wieder Arrays sein. • Zweidimensionaler Array Mehrd.Array, Strings etc.doc © 2010 InIT/ZHAW 3 − − • • In Java wird deshalb ein zweidimensionaler Array als Array von Arrays implementiert. Die Elemente einer Zeile stehen dabei wie beim eindimensionalen Array hintereinander im Speicher. − Aufeinanderfolgende Zeilen müssen jedoch nicht hintereinander im Speicher stehen. Mehrdimensionale Arrays − Auf die gleiche Weise können Arrays mit beliebig vielen Dimensionen aufgebaut werden als Array von Arrays von Arrays . Beispiel: Zweidimensionaler Array für die Umsatzzahlen von oben: int[][] umsatz; umsatz = new int [3][7]; 1.4 • Deklaration und Erzeugung Deklaration: − allgemein: Datentyp [][] Arrayname; EBNF 1: Deklaration eines zweidimensionalen Arrays − − − • Datentyp: Datentyp der einzelnen Elemente Array existiert nach der Deklaration noch nicht. Die Grösse des Arrays ist ebenfalls noch nicht bestimmt. Erzeugung des Arrays: Mehrd.Array, Strings etc.doc © 2010 InIT/ZHAW 4 Arraynname = new Datentyp [AnzahlZeilen][AnzahlSpalten]; EBNF 2: Erzeugung eines zweidimensionalen Arrays − • Tipp: Verwenden Sie eineVariable oder symbolische Konstante für Arraygrössen, nicht numerische Konstante. Beispiel 1: Tagesumsätze einer Woche in 7 verschiedenen Filialen final int ANZ_TAGE = 7; final int ANZ_FILIALEN = 7; int[][] umsatz; //zufällig gleich gross wie ANZTAGE umsatz = new int [ANZ_FILIALEN][ANZ_TAGE]; // Æ besserer Überblick • Beispiel 2: Schachbrett String[][] schachbrett; final int GROESSE = 8; schachbrett = new String[GROESSE][GROESSE]; • Beispiel 3: Kinoplätze boolean[][] kinoplatz; int anzReihen = 10; anzPlaetzeProReihe = 20; kinoplatz = new boolean[anzReihen][anzPlaetzeProReihe]; • • Arraygrenzen müssen nicht immer Konstanten sein, sondern es können auch beliebige GanzzahlAusdrücke mit Variablen sein. Länge der verschiedenen Dimensionen des zweidimensionalen Arrays: − Die Anzahl Zeilen stehen in der Variablen: Arrayname.length EBNF 3: Arraylänge − 1.5 • Bsp: int anzahlZeilen = umsatz.length; − Da jede Zeile des zweidimensionalen Arrays selbst wieder ein Array ist, besitzt jede Zeile eine eigene length-Variable, die die Länge der Zeile angibt. Falls die Anzahl Spalten in jeder Zeile gleich sind, kann irgend eine Zeile verwendet werden, um die Anzahl Spalten herauszufinden: int anzahlSpalten = umsatz[0].length − Randbemerkung: In Java müssen die Zeilen eines zweidimensionalen Arrays nicht unbedingt gleich viele Spalten aufweisen. Initialisierung Wie eindimensionale Arrays müssen auch mehrdimensionale Arrays initialisiert werden! Mehrd.Array, Strings etc.doc © 2010 InIT/ZHAW 5 − Möglichkeit 1: Direkt bei Deklaration int [][] tabelle = {{1,0,1},{0,1,0}}; − − • erzeugt einen Array mit 2 Zeilen und 3 Spalten und initialisiert ihn mit den entsprechenden Werten. Möglichkeit 2: Innerhalb des Programmcodes, normalerweise mit einer oder mehreren forSchleifen. Aufgabe: − Schreiben sie ein kleines Programmstück, das den Array umsatz auf 0 initialisiert. Folgende Deklarationen sind gegeben: final int ANZ_TAGE = 7; final int ANZ_FILIALEN = 7; int[][] umsatz = new int [ANZ_FILIALEN][ANZ_TAGE]; • 1.6 • • Lösung: Umgang mit Array-Elementen Ein einzelnes Element eines Arrays verhält sich wie eine Variable vom gleichen Typ. Für den Zugriff auf einzelnes Element des zweidimensionalen Arrays braucht es 2 Indices: − allgemein: Arrayname[zeilenindex][spaltenindex] EBNF 4: Zugriff auf ein Element eines zweidim. Arrays − − Beispiel: umsatz[2][3] bezeichnet das Element in der 3. Zeile und 4. Spalte des Arrays umsatz. Beachten Sie auch hier: Mehrd.Array, Strings etc.doc © 2010 InIT/ZHAW 6 − • Das 1. Element in der 1. Zeile eines zweidimensionalen Arrays hat die Indices [0][0] Die Indices selbst können auch Ausdrücke mit Variablen sein. Da in Java ein zweidimensionaler Array als Array von Arrays implementiert ist, kann auf eine Zeile des Arrays auch als Ganzes zugegriffen werden. Beispiel: umsatz[2] Æ Dies bezeichnet die Zeile 3 vom zweidimensionalen Array umsatz Æ Dies ist ein eindimensionaler Array mit 7 Elementen. 1.7 • • Übergabe von Arrays als Parameter Auch zweidimensionale Arrays werden einer Methode als Referenz übergeben. Beispiel 1: Methode für die Berechnung der Summe über alle Elemente eines beliebigen zweidimensionalen Arrays: public int sum(int[][] arr){ int total = 0; for (int row = 0; row < arr.length; row++){ for (int col = 0; col < arr[row].length; col++){ total = total + arr[row][col]; } } return total; } Programm 1: Methode, die die Summe über einen 2-dim. Array berechnet • Beachten Sie: − Bei der Parameterdeklaration des zweidimensionalen Arrays müssen die Grenzen des Arrays nicht angegeben werden. − Es können somit beliebig grosse Arrays mit der Methode sum verarbeitet werden. − Die aktuellen Arraygrenzen in den verschiedenen Dimensionen stehen in den jeweiligen length-Variablen. • Beispiel eines Aufrufs der Methode sum : int total; int[][] umsatz = new int [4][7]; ... total = sum(umsatz); Mehrd.Array, Strings etc.doc © 2010 InIT/ZHAW 7 • Beispiel 2: Die Methode createZeroMatrix in initialisiert einen bliebigen zweidimensionalen Array mit Nullen. public int[][] createZeroMatrix(int rows, int cols){ int[][] matrix = new int[rows][cols]; for (int row = 0; row < rows; row++){ for (int col = 0; col < cols; col++){ matrix[row][col] = 0; } } return matrix; } Programm 2: Methode, die einen 2-dim. Array erzeugt und mit 0 initialisiert. − Beispiel eines Aufrufs der Methode createZeroMatrix: int[][] mymatrix = createZeroMatrix(3,5); − 1.8 Dieser Aufruf erzeugt einen 2-dim. Array mit 3 Zeilen à 5 Spalten gefüllt mit Nullen. Beispielprogramm Umsatzzahlen Das Programm Umsatzzahlen (Programm 3)stellt eine Tabelle für das Eintragen der Tagesumsätze verschiedener Filialen zur Verfügung (siehe • Abbildung 1 ). Der Benützer gibt beim Textfeld die gewünschte Umsatzzahl ein. Das Applet berechnet sodann die Umsatztotale pro Filiale und pro Tag und stellt sie dar. Mehrd.Array, Strings etc.doc © 2010 InIT/ZHAW 8 Abbildung 1: Applet Umsatzzahlen • Der Programmcode des Applets Umsatzzahlen ist in Programm 3 aufgelistet. Mehrd.Array, Strings etc.doc © 2010 InIT/ZHAW 9 import java.awt.*; import java.applet.Applet; import java.awt.event.*; public class Umsatzzahlen extends Applet implements ActionListener{ private final int ANZ_FILIALEN = 3; private final int ANZ_TAGE = 7; private TextField[][] filialenUmsaetzeTF = new TextField[ANZ_FILIALEN+1][ANZ_TAGE+1]; private int[][] filialenUmsaetze = new int[ANZ_FILIALEN][ANZ_TAGE]; private int[] tagesUmsatzTotal = new int[ANZ_TAGE]; private int[] filialenUmsatzTotal = new int[ANZ_FILIALEN]; private int gesamtUmsatz = 0; public void init() { setSize(380,250); // Fenstergrösse setzen // Titel setzen Label title = new Label("Bitte Tagesumsatz pro Filiale im " + "entsprechenden Feld eingeben "); add(title); // Header-Labels add(new Label("Filiale ")); for (int tag = 1; tag <= ANZ_TAGE; tag++){ add(new Label(" T"+tag)); } add(new Label("Total")); // Ein Textfeld für jede Filiale und jeden Tag // 1. Kolonne: Filialennummer for(int filiale = 0; filiale < ANZ_FILIALEN+1; filiale++){ add(new Label(" "+filiale+" ")); for(int tag = 0; tag < ANZ_TAGE+1; tag++){ filialenUmsaetzeTF[filiale][tag] = new TextField("0"); add(filialenUmsaetzeTF[filiale][tag]); filialenUmsaetzeTF[filiale][tag].addActionListener(this); } filialenUmsaetzeTF[filiale][ANZ_TAGE].setEditable(false); } for(int tag = 0; tag < ANZ_TAGE+1; tag++){ filialenUmsaetzeTF[ANZ_FILIALEN][tag].setEditable(false); } Mehrd.Array, Strings etc.doc © 2010 InIT/ZHAW 10 } public void actionPerformed(ActionEvent event) { umsatzZahlenEinlesen(); berechneUmsatzTotale(); umsatzZahlenAusgeben(); repaint(); } // Berechnet Tages-, Filialen- und Gesamtumsatz private void berechneUmsatzTotale(){ gesamtUmsatz = 0; for(int filiale = 0; filiale < ANZ_FILIALEN; filiale++) { filialenUmsatzTotal[filiale] = 0; for(int tag = 0; tag < ANZ_TAGE; tag++) { filialenUmsatzTotal[filiale] += filialenUmsaetze[filiale][tag]; // Tagesumsätze der Filialen aufsummieren switch (filiale){ case 0: tagesUmsatzTotal[tag] = filialenUmsaetze[filiale][tag]; break; default: tagesUmsatzTotal[tag] += filialenUmsaetze[filiale][tag]; } } gesamtUmsatz += filialenUmsatzTotal[filiale]; } } private void umsatzZahlenEinlesen(){ for(int filiale = 0; filiale < ANZ_FILIALEN; filiale++) { for(int tag = 0; tag < ANZ_TAGE; tag++) { filialenUmsaetze[filiale][tag] = Integer.parseInt(filialenUmsaetzeTF[filiale][tag]. getText()); } } } private void umsatzZahlenAusgeben(){ Mehrd.Array, Strings etc.doc © 2010 InIT/ZHAW 11 for(int filiale = 0; filiale < ANZ_FILIALEN; filiale++) { filialenUmsaetzeTF[filiale][ANZ_TAGE].setText("" + filialenUmsatzTotal[filiale]); } for(int tag = 0; tag < ANZ_TAGE; tag++) { filialenUmsaetzeTF[ANZ_FILIALEN][tag].setText("" + tagesUmsatzTotal[tag]); } filialenUmsaetzeTF[ANZ_FILIALEN][ANZ_TAGE].setText("" + gesamtUmsatz); } } Programm 3: Umsatzzahlen 1.9 Aufgabe • Schreiben Sie eine Methode, die die Elemente einer beliebigen reellen Matrix mit einer Konstanten multipliziert. Dabei soll die gegebene Matrix nicht verändert werden. • Lösung: Mehrd.Array, Strings etc.doc © 2010 InIT/ZHAW 12 1.10 Professionelles Programmieren • Array-Längen mit aussagekräftigen final Konstanten definieren. • Methoden sollten übergebene Arrays (generell Objekte) nur lesen, aber nicht verändern. Stattdessen sollten sie auf einer Kopie des übergebenen Arrays arbeiten und das Resultat als Rückgabewert zurückgeben. Nicht null zurückgeben, wenn Array erwartet wird • • − sondern ein Array mit Länge 0 in der ersten Dimension Keine Referenzen auf Array-Konstanten nach aussen geben, da nur die Referenz konstant ist, die Werte im Array können trotzdem verändert werden (Sicherheitslücke). Mehrd.Array, Strings etc.doc © 2010 InIT/ZHAW 13 2 Aufzählungstypen 2.1 • • 2.2 • • • 2.3 • • • • Ziele Sie können eigene Aufzählungstypen deklarieren. Sie verwenden eigene Aufzählungstypen situationsgerecht. Einführung Oft hat man es in Programmen mit einer vordefinierte Menge von Dingen zu tun, die eindeutig definiert sind: Beispiele − Wochentage: Montag, Dienstag, Mittwoch, Donnerstag, Freitag − Geschlecht: männlich, weiblich − Kleidergrösse: S, M, L, XL Probleme: − Wenn man diese Werte einfach als Strings implementiert, muss man jedesmal überprüfen, ob ein String-Wert z.B. ein gültiger Wochentag ist. Zudem muss man Gross- und Kleinschreibung berücksichtigen. − Implementiert man jeden Aufzählungswert durch eine int-Konstante, so muss man ebenfalls überprüfen, ob ein gegebener Wert überhaupt gültig ist. Zudem muss man die Zuordnung der Zahlen z.B. zu den einzelnen Wochentagen kennen. Enumerations Enumerations sind vom Programmierer definierte Datentypen für Aufzählungen, sogenannte Aufzählungstypen Damit kann man einen eigenen Datentyp z.B. für die Wochentage definieren Vorteil: − Es können nur gültige Wochentage im Programm verwendet werden (Compiler überprüft dies) − Die Wochentage tauchen wirklich als solche im Programm auf, was die Lesbarkeit der Programme stark erhöht. Deklaration von Aufzählungstypen enum Enumtyp { el1, el2, ..., elN } EBNF 5: Deklaration einer Enumeration − Beispiele − enum Tag { MONTAG, DIENSTAG, MITTWOCH, DONNERSTAG, FREITAG, SAMSTAG, SONNTAG } − enum Wochentag { MONTAG, DIENSTAG, MITTWOCH, DONNERSTAG, FREITAG } − enum Geschlecht { MAENNLICH, WEIBLICH } − enum Kleidergroesse { S, M, L, XL } − Mehrd.Array, Strings etc.doc © 2010 InIT/ZHAW 14 − • • Wo werden Aufzählungstypen deklariert? − emum-Deklarationen werden normalerweise wie eine eigene Klasse deklariert − enum-Deklarationen können aber auch innerhalb einer anderen Klasse deklariert werden − Sie müssen aber immer ausserhalb der Methoden deklariert sein, wie Instanzvariablen-Deklarationen Deklaration einer Variablen eines Aufzählungstyps − Gleich wie eine Instanzvariablendeklaration einer normalen Klasse − Beispiele: − Wochentag tag; − Geschlecht g = Geschlecht.MAENNLICH; − Kleidergroesse size = Kleidergroesse.S; Verwendung von Aufzählungstypen − Variablen von Aufzählungstypen können wie normale Variablen verwendet werden. − Es können ihnen allerdings nur Werte zugewiesen werden, die im Aufzählungstyp definiert sind. − Die Werte eines Aufzählungstyps werden wie statische Klassenvariablen angesprochen − Beispiele: tag tag tag tag − = = = = Wochentag.DIENSTAG; DIENSTAG "DIENSTAG"; Wochentag.dienstag; ok falsch, Typ-Name fehlt! falsch, String statt Wochentag falsch, Dienstag nicht gleich geschrieben wie in der Enum-Deklaration Aufzählungswerte können nur innerhalb desselben Aufzählungstyps zugewiesen und verglichen werden tag = Wochentag.MONTAG; tag = Tag.MONTAG; • // // // // // // // ok, derselbe Aufzählungstyp // falsch, nicht derselbe // Aufzählungstyp Wie werden Aufzählungstypen in Java implementiert: − Im Hintergrund erzeugt Java für jeden Aufzählungstyp eine entsprechende Klasse mit den nötigen Konstanten-Definitionen − Beispiel: enum Kleidergrösse {S, M, L, XL } − − erzeugt eine Klasse Kleidergroesse mit den entsprechenden Konstanten. Dazu werden Objekte der Enumeration-Klasse als Konstanten (siehe Abschnitt Fehler! Verweisquelle konnte nicht gefunden werden.) der Klasse Kleidergroesse deklariert: class Kleidergroesse{ public final static public final static public final static public final static } Mehrd.Array, Strings etc.doc Kleidergroesse Kleidergroesse Kleidergroesse Kleidergroesse © 2010 InIT/ZHAW S = new Kleidergroesse(); M = new Kleidergroesse(); L = new Kleidergroesse(); XL = new Kleidergroesse(); 15 − − Eine generierte Aufzählungs-Klasse Enum enthält verschiedene vordefinierte Methoden: − static Enum valueOf(String s) gibt den Aufzählungswert zum entsprechenden Namen (String) zurück − static Enum[] values() liefert einen Array mit allen Aufzählungswerten zurück − int ordinal() Die Aufzählungswerte weisen ein bestimmte Reihenfolge auf, wobei das erste Aufzählungselement den Index 0 hat. ordinal() gibt den Index eines Aufzählungselementes zurück − int compareTo(Enum e) vergleicht zwei Aufzählungswerte anhand ihrer Indices − boolean equals(Enum e) vergleicht zwei Enum-Werte. Enum-Werte können auch mit == verglichen werden. Neben den generierte Methoden können auch eigene Methoden zu Aufzählungsklassen hinzugefügt werden − Beispiel Tag: enum Tag { MONTAG, DIENSTAG, MITTWOCH, DONNERSTAG, FREITAG, SAMSTAG, SONNTAG; boolean istWochenende(){ return this == SAMSTAG || this == SONNTAG; } } − Aufruf der Methoden der Aufzählungsklasse public class Enumeration extends Applet { public void paint(Graphics g){ Tag t = Tag.SONNTAG; g.drawString("Heute ist " + t.toString(), 50, 50); if (t.istWochenende()){ g.drawString("Es ist Wochenende", 50, 70); } } } − Mehrd.Array, Der Output des obigen Applets Enumeration ist in Abbildung 2 dargestelllt Strings etc.doc © 2010 InIT/ZHAW 16 Abbildung 2: Applet Enumeration • 2.4 • Aufgabe: Schreiben sie die Methode boolean istArbeitstag() für die obige enum Tag. Professionelles Programmieren Enumerations verwenden statt int- oder String-Konstanten: − Enums haben aussagekräftige Namen − Wertebereich ist vorgegen und wird vom Compiler überprüft − Keine Probleme mit Tippfehlern wie bei Strings Mehrd.Array, Strings etc.doc © 2010 InIT/ZHAW 17 3 Reguläre Ausdrücke und StringTokenizer 3.1 • • Sie können mit einfachen regulären Ausdrücken umgehen. Sie setzen die Klasse StringTokenizer situationsgerecht ein. 3.2 • • • Ziele Reguläre Ausdrücke Reguläre Ausdrücke sind eine Metasprache, mit der man effizient eine ganze Klasse von Strings beschreiben kann. Damit kann man einfach nach Strings, die bestimmte Eigenschaften aufweisen, suchen und/oder sie ersetzen. Beispiel: − Im Programm Sales sollen alle int-Variablen durch long-Variablen ersetzt werden. Ersetzt man nun einfach alle int-Vorkommen durch float, so wird z.B. auch repaint() ersetzt durch repafloat() oder Integer.parseInt(...) durch floateger.parsefloat(...)! − Mit Hilfe von regulären Ausdrücken würde man das Ersetzen folgendermassen einschränken: Ersetze alle Vorkommen von int gefolgt von mindestens einem Leerschlag durch float. − Der dazu nötige reguläre Ausdruck, um nur diese Vorkommen von int zu finden, würde folgendermassen aussehen: .*int[ ]+.* − Um einen regulären Ausdruck zu spezifizieren, braucht es Metasymbole wie bei EBNF. Die wichtigsten Metasymbole für reguläre Ausdrücke sind zusammen mit ihrer Bedeutung und Beispielen in Tabelle aufgelistet. Metasymbol Beispiel Bedeutung Menge der gültigen Literale * ax*b 0 oder mehrere x ab, axb, axxb, axxxb,... + ax+b 1 oder mehrere x axb, axxb, axxxb, ... ? ax?b x optional ab, axb | a|b a oder b a, b () x(a|b) x Gruppierung xax, xbx . a.b Ein beliebiges Zeichen aab, acb, aZb, a[b, ... [ ] [abc]x 1 Zeichen aus einer Klasse ax, bx, cx [-] [a-h] Zeichenbereich a, b, c, ..., h Tabelle 1: Metasymbole für reguläre Ausdrücke Mehrd.Array, Strings etc.doc © 2010 InIT/ZHAW 18 • Übungsbeispiele: Finden Sie für die in Tabelle aufgeführten regulären Ausdrücke alle gültigen Beispiele, die dem regulären Ausdruck entsprechen. Regulärer Ausdruck Menge der gültigen Literale a?b+ {ein, eine, einer} a(x|y)?b* Java-Bezeichner alle ganze Zahlen Tabelle 2: Ergänzen Sie obige Tabelle • Die wichtigsten Methoden der Klasse String, die reguläre Ausdrücke verwenden: boolean matches(String regexp) − gibt an, ob der String dem in regexp angegebenen regulären Ausdruck entspricht. − Beispiele: String text = "Hallo Welt", neu; boolean passt; passt passt passt passt = = = = text.matches("H.*W.*"); // gibt true zurück text.matches("H..o Wel?t"); // gibt false zurück text.matches("H[alo]* W[elt]+"); // gibt true zurück text.matches("Hal+o Welt.+"); // gibt false zurück String replaceAll(String regexp, String replaceStr) − ersetzt alle Substrings des gegebenen Strings, die dem regulären Ausdruck regexp entsprechen, durch replaceStr. − Beispiel: neu = text.replaceAll(„l+“, „LL“); // neu = „HaLLo WeLLt“ String replaceFirst(String regexp, String replaceStr) − wie replaceAll, ersetzt aber nur das erste Vorkommen von regexp im gegebenen String. − Beispiel: neu = text.replaceFirst(„l+“, „LL“); // neu = „HaLLo Welt“ String[] split(String regexp) − teilt den gegebenen String in Substrings auf, wobei Zeichenfolgen, die dem regulären Ausdruck regexp entsprechen, als Grenzmarken interpretiert werden. Mehrd.Array, Strings etc.doc © 2010 InIT/ZHAW 19 − Beispiele: String[] teile = text.split("[ l]"); // teile[0] = "Ha", teile[1] ="", teile[2] = "o", // teile[3] = "We", teile[4] = "t" String[] teile = text.split(" l"); // teile[0] = "Hallo Welt" 3.3 • • Klasse StringTokenizer Die Klasse StringTokenizer teilt einen gegebenen String in Substrings (Tokens) auf, wobei die Tokens durch Grenzmarken voneinander getrennt sind. Beispiel: String data = "4, 5, 6 2,8,, 100, 18"; String grenzMarken = " ,"; // Grenzmarken sind Kombinationen von // " " und/oder "," StringTokenizer tokens = new StringTokenizer(data, grenzMarken); − − • • 3.4 Beliebige Kominationen von " " und "," (z.B.", ," werden zu einem einzigen Delimiter zusammen gefasst. Der String data im obigen Beispiel zählt also nur 7 Tokens. Nach dem Erzeugen des StringTokenizer-Objekts tokens enthält dieses die Tokens des analysierten Strings data. Folgende Methoden des StringTokenizer-Objekts stehen dann zur Verfügung: String nextToken() gibt nächstes Token zurück boolean hasMoreTokens() gibt true zurück, falls noch Tokens vorhanden sind int countTokens() gibt die Anzahl noch verfügbarer Tokens zurück Beispiel: int x = 20, y = 20; while (tokens.hasMoreTokens()) { g.drawString(tokens.nextToken(), x, y); y = y + 15; } Professionelles Programmieren Mehrd.Array, Strings etc.doc © 2010 InIT/ZHAW 20