Mehrd.Array, Strings etc

Werbung
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
Herunterladen