Rheinwerk Computing < openbook >


 
Inhaltsverzeichnis
Materialien
Vorwort
1 Java ist auch eine Sprache
2 Imperative Sprachkonzepte
3 Klassen und Objekte
4 Arrays und ihre Anwendungen
5 Der Umgang mit Zeichenketten
6 Eigene Klassen schreiben
7 Objektorientierte Beziehungsfragen
8 Ausnahmen müssen sein
9 Geschachtelte Typen
10 Besondere Typen der Java SE
11 Generics<T>
12 Lambda-Ausdrücke und funktionale Programmierung
13 Architektur, Design und angewandte Objektorientierung
14 Java Platform Module System
15 Die Klassenbibliothek
16 Einführung in die nebenläufige Programmierung
17 Einführung in Datenstrukturen und Algorithmen
18 Einführung in grafische Oberflächen
19 Einführung in Dateien und Datenströme
20 Einführung ins Datenbankmanagement mit JDBC
21 Bits und Bytes, Mathematisches und Geld
22 Testen mit JUnit
23 Die Werkzeuge des JDK
A Java SE-Module und Paketübersicht
Stichwortverzeichnis


Download:

- Listings, ca. 2,7 MB


Buch bestellen
Ihre Meinung?



Spacer
<< zurück
Java ist auch eine Insel von Christian Ullenboom

Einführung, Ausbildung, Praxis
Buch: Java ist auch eine Insel


Java ist auch eine Insel

Pfeil5 Der Umgang mit Zeichenketten
Pfeil5.1 Von ASCII über ISO-8859-1 zu Unicode
Pfeil5.1.1 ASCII
Pfeil5.1.2 ISO/IEC 8859-1
Pfeil5.1.3 Unicode
Pfeil5.1.4 Unicode-Zeichenkodierung
Pfeil5.1.5 Escape-Sequenzen/Fluchtsymbole
Pfeil5.1.6 Schreibweise für Unicode-Zeichen und Unicode-Escapes
Pfeil5.1.7 Java-Versionen gehen mit dem Unicode-Standard Hand in Hand *
Pfeil5.2 Datentypen für Zeichen und Zeichenfolgen
Pfeil5.3 Die Character-Klasse
Pfeil5.3.1 Ist das so?
Pfeil5.3.2 Zeichen in Großbuchstaben/Kleinbuchstaben konvertieren
Pfeil5.3.3 Vom Zeichen zum String
Pfeil5.3.4 Von char in int: vom Zeichen zur Zahl *
Pfeil5.4 Zeichenfolgen
Pfeil5.5 Die Klasse String und ihre Methoden
Pfeil5.5.1 String-Literale als String-Objekte für konstante Zeichenketten
Pfeil5.5.2 Konkatenation mit +
Pfeil5.5.3 String-Länge und Test auf Leer-String
Pfeil5.5.4 Zugriff auf ein bestimmtes Zeichen mit charAt(int)
Pfeil5.5.5 Nach enthaltenen Zeichen und Zeichenfolgen suchen
Pfeil5.5.6 Das Hangman-Spiel
Pfeil5.5.7 Gut, dass wir verglichen haben
Pfeil5.5.8 String-Teile extrahieren
Pfeil5.5.9 Strings anhängen, zusammenfügen, Groß-/Kleinschreibung und Weißraum
Pfeil5.5.10 Gesucht, gefunden, ersetzt
Pfeil5.5.11 String-Objekte mit Konstruktoren und aus Wiederholungen erzeugen *
Pfeil5.6 Veränderbare Zeichenketten mit StringBuilder und StringBuffer
Pfeil5.6.1 Anlegen von StringBuilder-Objekten
Pfeil5.6.2 StringBuilder in andere Zeichenkettenformate konvertieren
Pfeil5.6.3 Zeichen(folgen) erfragen
Pfeil5.6.4 Daten anhängen
Pfeil5.6.5 Zeichen(folgen) setzen, löschen und umdrehen
Pfeil5.6.6 Länge und Kapazität eines StringBuilder-Objekts *
Pfeil5.6.7 Vergleich von StringBuilder-Exemplaren und Strings mit StringBuilder
Pfeil5.6.8 hashCode() bei StringBuilder *
Pfeil5.7 CharSequence als Basistyp
Pfeil5.8 Konvertieren zwischen Primitiven und Strings
Pfeil5.8.1 Unterschiedliche Typen in String-Repräsentationen konvertieren
Pfeil5.8.2 String-Inhalt in einen primitiven Wert konvertieren
Pfeil5.8.3 String-Repräsentation im Format Binär, Hex und Oktal *
Pfeil5.8.4 parseXXX(…)- und printXXX()-Methoden in DatatypeConverter *
Pfeil5.9 Strings zusammenhängen (konkatenieren)
Pfeil5.9.1 Strings mit StringJoiner zusammenhängen
Pfeil5.10 Zerlegen von Zeichenketten
Pfeil5.10.1 Splitten von Zeichenketten mit split(…)
Pfeil5.10.2 Yes we can, yes we scan – die Klasse Scanner
Pfeil5.11 Ausgaben formatieren
Pfeil5.11.1 Formatieren und Ausgeben mit format()
Pfeil5.12 Zum Weiterlesen
 

Zum Seitenanfang

5.3    Die Character-Klasse Zur vorigen ÜberschriftZur nächsten Überschrift

char ist ein primitiver Datentyp und besitzt keine Methoden. Daher gibt es im Kernpaket java.lang die Klasse Character mit einer großen Anzahl Methoden, die im Umgang mit einzelnen Zeichen interessant sind, viele davon statisch. Dazu gehören Methoden zum Testen, etwa ob ein Zeichen eine Ziffer, ein Buchstabe oder ein Sonderzeichen ist.

 

Zum Seitenanfang

5.3.1    Ist das so? Zur vorigen ÜberschriftZur nächsten Überschrift

Allen Testmethoden ist gemeinsam, dass sie mit der Vorsilbe is beginnen und ein boolean liefern. Dazu gesellen sich Methoden zum Konvertieren, etwa in Groß-/Kleinschreibung.

Ein paar Beispiele:

Ausdruck

Ergebnis

Character.isDigit( '0' )

true

Character.isDigit( '-' )

false

Character.isLetter( 'ß' )

true

Character.isLetter( '0' )

false

Character.isWhitespace( ' ' )

true

Character.isWhitespace( '-' )

false

Tabelle 5.5    Ergebnisse einiger »isXXX()«-Methoden

Alle diese Methoden »wissen« über die Eigenschaften der einzelnen Unicode-Zeichen Bescheid. Und der Codepoint jedes Unicode-Zeichens ist immer der gleiche, egal ob ein Programm in Deutschland oder in der Mongolei ausgeführt wird.

[»]  Hinweis

Mit »letter« ist nicht nur ein bekannter Buchstabe wie »a« oder »α« gemeint. Unicode enthält über hunderttausend Zeichen, davon Hunderte von Buchstaben und Ziffern.

Testen, ob eine Zeichenkette nur aus Ziffern besteht

Im folgenden Beispiel wollen wir die Methode deklarieren, die einen String abläuft und testet, ob der String nur aus Ziffern besteht. Obwohl so eine Funktionalität in der Praxis nützlich ist, bietet Java SE dafür keine simple Methode.

Listing 5.1    src/main/java/com/tutego/insel/string/IsNumeric.java, Ausschnitt

public class IsNumeric {



/**

* Returns {@code true} if the String contains only Unicode digits.

* An empty string or {@code null} leads to {@code false}.

*

* @param string Input String.

* @return {@code true} if string is numeric, {@code false} otherwise.

*/


public static boolean isNumeric( String string ) {

if ( string == null || string.length() == 0 )

return false;



for ( int i = 0; i < string.length(); i++ )

if ( ! Character.isDigit( string.charAt( i ) ) )

return false;

return true;

}



public static void main( String[] args ) {

System.out.println( isNumeric( "1234" ) ); // true

System.out.println( isNumeric( "12.4" ) ); // false

System.out.println( isNumeric( "-123" ) ); // false

}

}

Durch unsere Methode ist definiert, dass null und ein leerer String nicht als numerisch angesehen werden, allerdings lässt sich auch definieren, dass null zu einer Ausnahme führen soll und der leere String durchaus numerisch ist. Konventionen wie diese liegen beim Autor der Bibliothek, und unterschiedliche Utility-Bibliotheken mit solchen Hilfsfunktionen haben dort unterschiedliche Einsatzgebiete.

Das Beispiel nutzt zwei String-Methoden: length() liefert die Länge eines Strings, und charAt(int) liefert das Zeichen an der gewünschten Stelle. Eine Schleife iteriert über den String und testet jedes Zeichen mit isDigit(…). Ist ein Zeichen keine Ziffer, verlässt return false automatisch die Schleife. Läuft die Schleife erfolgreich durch, kann ein return true vermelden, dass jedes Zeichen eine Ziffer war.

Die wichtigsten isXXX(…)-Methoden im Überblick

final class java.lang.Character

implements Serializable, Comparable<Character>
  • static boolean isDigit(char ch)

    Handelt es sich um eine Ziffer zwischen 0 und 9?

  • static boolean isLetter(char ch)

    Handelt es sich um einen Buchstaben?

  • static boolean isLetterOrDigit(char ch)

    Handelt es sich um ein alphanumerisches Zeichen?

  • static boolean isLowerCase(char ch)

  • static boolean isUpperCase(char ch)

    Ist es ein Klein- oder ein Großbuchstabe?

  • static boolean isWhiteSpace(char ch)

    Ist es ein Leerzeichen, Zeilenvorschub, Return oder Tabulator, also ein sogenannter Weißraum[ 130 ](Es wird Weißraum genannt, weil das ausgegebene Zeichen den Raum in der Regel weiß lässt, aber die Position der Ausgabe dennoch fortschreitet. ) (engl. white space), auch Leerraum genannt?

[»]  Wortwahl

Ein Leerzeichen ist in diesem Buch nur das Zeichen » «, das die Leertaste generiert. Es hat den ASCII-Code 32, in Unicode \u0020. Der Begriff Weißraum steht hingegen für alles das, was Leerraum schafft, also Leerzeichen, Tabulator, Return usw.

 

Zum Seitenanfang

5.3.2    Zeichen in Großbuchstaben/Kleinbuchstaben konvertieren Zur vorigen ÜberschriftZur nächsten Überschrift

Zum Konvertieren eines Zeichens in Groß-/Kleinbuchstaben deklariert die Character-Klasse die Methoden toUpperCase(…) und toLowerCase(…). Die testenden isXXX(…)-Methoden finden oft Anwendung beim Ablaufen einer Zeichenkette.

Unser nächstes Beispiel fragt den Benutzer nach einem String. Gültige Buchstaben sollen in Großbuchstaben konvertiert werden, und jeder Weißraum soll durch einen Unterstrich ersetzt werden. Zum Ablaufen der Eingabe nutzen wir wieder die schon bekannten String-Methoden length() und charAt(int):

Listing 5.2    src/main/java/com/tutego/insel/string/UppercaseWriter.java, Ausschnitt

String input = new java.util.Scanner( System.in ).nextLine();



for ( int i = 0; i < input.length(); i++ ) {

char c = input.charAt( i );

if ( Character.isWhitespace( c ) )

System.out.print( '_' );

else if ( Character.isLetter( c ) )

System.out.print( Character.toUpperCase( c ) );

}

Wenn die Eingabe etwa »honiara brotherhood guesthouse1« ist, ist die Ausgabe »HONIARA_BROTHERHOOD_GUESTHOUSE«. Die »1« verschwindet, weil sie weder Weißraum noch ein Buchstabe ist.

final class java.lang.Character

implements Serializable, Comparable<Character>
  • static char toUpperCase(char ch)

  • static char toLowerCase(char ch)

    Die statischen Methoden liefern den passenden Groß- bzw. Kleinbuchstaben zurück.

[»]  Hinweis

Die Methoden toUpperCase(…) und toLowerCase(…) gibt es zweimal: einmal als statische Methoden bei Character – dann nehmen sie genau ein char als Argument – und einmal als Objektmethoden auf String-Exemplaren.

Vorsicht ist bei Character.toUpperCase('ß') geboten, denn das Ergebnis ist »ß«, anders als bei der String-Methode "ß".toUpperCase(), die das Ergebnis »SS« liefert; einen String, der um eins verlängert ist. Auch wenn es mittlerweile ein großes »ß« (Unicode U+00DF) gibt, liefert Java bei Character.toUpperCase('ß') dennoch Unicode U+00DF, nicht U+1E9E.[ 131 ](Die Geschichte vom großen ß fasst Wikipedia zusammen: https://de.wikipedia.org/wiki/Gro%C3%9Fes_%C3%9F. )

 

Zum Seitenanfang

5.3.3    Vom Zeichen zum String Zur vorigen ÜberschriftZur nächsten Überschrift

Um ein Unicode-Zeichen in einen String zu konvertieren, können wir die statische überladene String-Methode valueOf(char) nutzen. Eine vergleichbare Methode gibt es auch in Character, und zwar die statische Methode toString(char). Beide Methoden haben die Einschränkung, dass das Unicode-Zeichen nur 2 Byte lang sein kann. String deklariert dafür auch valueOfCodePoint(int). So eine Methode fehlte bisher in Character; erst in Java 11 ist toString(int) eingezogen; intern delegiert sie an valueOfCodePoint(int).

 

Zum Seitenanfang

5.3.4    Von char in int: vom Zeichen zur Zahl * Zur vorigen ÜberschriftZur nächsten Überschrift

Wenn Zeichen aus Benutzereingaben stammen, stellt sich die Anforderung, sie in die Zahl zu konvertieren. Aus der Ziffer '5' soll der numerische Wert 5 werden. Nach alter Hacker-Tradition war die Lösung immer die, eine '0' abzuziehen. Die ASCII-Null '0' hat den char-Wert 48, '1' hat dann den Wert 49, bis '9' schließlich 57 erreicht. So ist logischerweise '5' - '0' = 53 – 48 = 5. Die Lösung hat den Nachteil, dass sie nur für ASCII-Ziffern funktioniert.

Eine ordentliche Java-Lösung besteht zum Beispiel darin, ein char in einen String zu konvertieren und diesen über eine Integer-Methode zu konvertieren, etwa so:

char c = '5';

int i = Integer.parseInt( String.valueOf(c) ); // 5

Die parseInt(…)-Methode ist voll internationalisiert und konvertiert ebenso Dezimalzahlen aus anderen Schriftsystemen, etwa Hindi/Sanskrit:

System.out.println( Integer.parseInt( "inline image" ) );   // 5

Das funktioniert, ist jedoch für einzelne Zeichen nicht besonders effizient in Schleifen. Es gibt zwei andere Möglichkeiten, mit statischen Methoden aus der Klasse Character.

getNumericValue(…)-Methode

Die Character-Methode getNumericValue(char) liefert den numerischen Wert einer Ziffer zurück. Natürlich arbeitet die Methode wieder internationalisiert:

int i = Character.getNumericValue( '5' );

System.out.println( i ); // 5

System.out.println( Integer.parseInt( "inline image" ) ); // 5

Die Methode ist viel leistungsfähiger, denn sie kennt den tatsächlichen »Wert« aller Unicode-Zeichen, zum Beispiel auch der römischen Ziffern I, II, III, IV, V, VI, VII, VIII, IX, X, XI, XII, L, C, D, M …, die im Unicode-Alphabet ab '\u2160' stehen:

System.out.println( Character.getNumericValue( '\u216f' ) ); // 1000

Das kann Integer.parseInt(…) nicht verarbeiten; eine Ausnahme ist die Folge.

XXXdigit(…)-Methoden

Die Character-Klasse besitzt ebenso eine Umwandlungsmethode für Ziffern bezüglich einer beliebigen Basis, und das auch in die andere Richtung.

final class java.lang.Character

implements Serializable, Comparable<Character>
  • static int digit(char ch, int radix)

    Liefert den numerischen Wert, den das Zeichen ch unter der Basis radix besitzt. Beispielsweise ist Character.digit('f', 16) gleich 15. Erlaubt ist jedes Zahlensystem mit einer Basis zwischen Character.MIN_RADIX (2) und Character.MAX_RADIX (36). Ist keine Umwandlung möglich, beträgt der Rückgabewert –1.

  • static char forDigit(int digit, int radix)

    Konvertiert einen numerischen Wert in ein Zeichen. Beispielsweise ist Character.forDigit(6, 8) gleich »6«, und Character.forDigit(12, 16) ist »c«.

[zB]  Beispiel

Konvertiere eine Zeichenkette mit Ziffern in eine Ganzzahl:

char[] chars = { '3', '4', '0' };

int result = 0;

for ( char c : chars ) {

result = result * 10 + Character.digit( c, 10 );

System.out.println( result );

}

Die Ausgabe ist 3, 34 und 340.

 


Ihre Meinung?

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de

<< zurück
 Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Java ist auch eine Insel Java ist auch eine Insel

Jetzt Buch bestellen


 Buchempfehlungen
Zum Rheinwerk-Shop: Captain CiaoCiao erobert Java

Captain CiaoCiao erobert Java




Zum Rheinwerk-Shop: Java SE 9 Standard-Bibliothek

Java SE 9 Standard-Bibliothek




Zum Rheinwerk-Shop: Algorithmen in Java

Algorithmen in Java




Zum Rheinwerk-Shop: Objektorientierte Programmierung

Objektorientierte Programmierung




 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und in die Schweiz

InfoInfo



 

 


Copyright © Rheinwerk Verlag GmbH 2021

Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.

Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

 

[Rheinwerk Computing]



Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de



Cookie-Einstellungen ändern