MezData-Logo

Strings und String-Funktionen

Strings sind Objekte

Wie werden in Java Zeichenketten (Strings) abgespeichert? Ein String besteht aus einer Kette von Buchstaben (char). Buchstaben müssen codiert werden, hier ein Beispiel:

public class StringEinfuehrung{
 static String textLatin = "Gießen, Öl und überall Äpfel.";
}

Beim Klick auf Inspizieren ist zu sehen wie die Zeichenkette abgespeichert wird. Java versucht möglichst Platz zu sparen und verwendet bei Zeichen, die mit der Latin-1 Codetabelle codiert werden können ein Byte.

Beachte Position [3] (-33)

-33 => 256-33= 223 = 0xDF entspricht dem ß in Latin-1

Unicode-Zeichen

  static String textUnicode = "\u263a\u20ac\u26c4\u2620";

Mittels Unicode-Zeichencodierung sind viele weitere Zeichen möglich:

( ☺€⛄☠) Abschnitt in der Unicode-Tabelle dabei werden allerdings mehr als 1 Byte Speicherplatz benötigt.

Inspizieren
Inspizieren
Inspizieren

Escape-Sequenzen/Fluchtsymbole

Spezielle Zeichen, etwa Zeilenumbruch oder Tabulator können in einem String oder einem Char mit Escape-Sequenzen erzeugt werden.

Zeichen Bedeutung
\b Rückschritt (Backspace)
\n Zeilenschaltung (Newline)
\f Seitenumbruch (Formfeed)
Bewirkt das Löschen des Konsolenfensters
\r Wagenrücklauf (Carriage Return)
\t horizontaler Tabulator
\" doppeltes Anführungszeichen
\' einfaches Anführungszeichen (Quote)
\\ Backslash
public class StringEinfuehrung{
  static String textLatin = "Gießen, Öl und überall Äpfel.";
  static String textUnicode = "\u263a\u20ac\u26c4\u2620";
  static void testen(){
    System.out.println("\ftextLatin: \t\""+textLatin+"\"");
    System.out.println("textUnicode: \t\""+textUnicode+"\"");
  }
}

Erzeugt diese Ausgabe

 textLatin: 	"Gießen, Öl und überall Äpfel."
textUnicode: "☺€⛄☠"

Länge eines Strings ermitteln und den n-ten Buchstaben erhalten

Quellcode [Strings/StringEinfuehrung.java]
public class StringEinfuehrung{
  static String textL = "Gießen, Öl und überall Äpfel."; // Latin-1
  static String textU = "\u263a\u20ac\u26c4\u2620"; // UTF-16 ☺€⛄☠
 
  static void testen(){
    System.out.println("\ftextL: \t\""+textL+"\"");
    System.out.println("textU: \t\""+textU+"\"");
    System.out.println("getLaenge(textL) \t-> "+getLaenge(textL));
    System.out.println("gibBuchstabe(textL,3) \t-> "+gibBuchstabe(textL,3));
  }
  static int getLaenge(String s){
    return s.length();  // length() ergibt die Laenge von s
  }
  static char gibBuchstabe(String s,int n){
    return s.charAt(n);  // charAt() ergibt das n-te Zeichen
  }
}

Info: Strings können nicht verändert werden: Lesen eines Buchstabens ist erlaubt, aber das Umschreiben einer Stelle ist nicht möglich! Der Hintergrund dafür ist die Threadsicherheit: Wenn zwei Threads den selben String verändern könnten, wären Schwierigkeiten vorprogrammiert.

Einen String durchlaufen mit For-Schleife

Buchstaben zählen mit For Schleife

Die Anzahl der Buchstaben c in einem String s sollen gezählt werden. Von Position 0 bis zum höchsten Index wird der String mit einer For-Schleife (auch Zählschleife genannt) durchlaufen.
Eine Indexvariable i wird mit 0 initialisiert. Solange die Schleifenbedingung wahr ist wird der Schleifenrumpf ausgeführt, sonst wird zum Ende der Schleife gesprungen. Nach der Bearbeitung des Rumpfs wird im Inkrement-Teil die Indexvariable verändert. Danach wird wieder überprüft ob die Schleifenbedingung noch erfüllt ist. Die Angabe der Schrittweite im Struktogramm ist nur erforderlich, falls sie nicht 1 ist.

Kleinbuchstaben zählen

static int zaehleKleinBuchstaben(String s){
  int i; // Index
  int anzahl = 0;
  char c;
for(i=0;i<s.length();i++){ // String durchlaufen
c=s.charAt(i); // Buchstaben zwischenspeichern
if (c>='a' && c<='z'){ // Kleinbuchstabe im ASCII-Bereich? anzahl++; }else switch (c){ // weitere Kleinbuchstaben? case 'ä': case 'ö': case 'ü': case 'ß': anzahl++; } } return anzahl; }

Info: In Java gibt es auch eine Methode boolean isLowerCase(char c), die für alle Zeichen zurückgibt, ob sie Kleinbuchstaben sind.

Struktogramm

In Kleinbuchstaben umwandeln

static String inKleinBuchstaben(String s){
  return s.toLowerCase();//Methode aus Java nutzen
}
static String inKleinBuchstaben_(String s){
  int i;
  char c;
  String rueckgabe = "";
  for(i=0;i<s.length();i++){//den String durchlaufen
    c=s.charAt(i);
    if(c>='A' && c<='Z'){
      rueckgabe = rueckgabe + (char)(c -'A'+'a');
    }else{
      switch(c){
        case 'Ä': c='ä';break;
        case 'Ö': c='ö';break;
        case 'Ü': c='ü';break;
      }
rueckgabe = rueckgabe + c; } } return rueckgabe; }

Erstellen Sie ein Struktogramm für inKleinBuchstaben_(s:Text):Text

Lösung.. Struktogramm

Erstellen Sie den Quellcode für eine Methode inKleinBuchstaben2(s: Text):Text unter Verwendung der Java-Methode char toLowerCase(char c).

Info: In Java gibt es auch die String-Methode String toLowerCase() Bsp.: "Hallo Welt".toLowerCase() => "hallo welt"

Zeichenfolgen bearbeiten

Ist String in Quellstring enthalten

static boolean enthaltenText(String quelle, String a){
  int i,k=0;
  for(i=0;i<quelle.length();i++){
    if(quelle.charAt(i)==a.charAt(k)){
      k++;
      if(a.length()==k) return true;
    }
    else k=0;
  }
  return false;
}

enthaltenText(quelle:Text,a:Text):Boolean Der Text a ist in quelle enthalten: enthaltenText("Anna ist im Garten","ist") -> true
Info: Java-Methode boolean quelle.contains(String a)

Struktogrammlösung.. Struktogramm

Erste n-Zeichen aus Quellstring

static String ersteNZeichen(String s,int n){
  int i;
  String k="";
  for(i=0;i<n;i++){
    if(i>=s.length()) break;
    k+=s.charAt(i);
  }
  return k;
}

ersteNZeichen(s:Text,n:GZ):Text gibt die ersten n Zeichen aus einem String s zurück. Bsp.: ersteNZeichen("Levin hat kurze Haare",5)=>"Levin"

Info: Java substring(0,n-1) ergibt das Gleiche

Zahlen aus Strings extrahieren

static int ermittleZahl(String s){
  return Integer.parseInt(s);
}
static String ersteZahl(String s){
  String zahl = "";
  int i;
  char c;
  boolean parsen = false;
  for(i=0;i<s.length();i++){
    c = s.charAt(i);
    if(c>='0' && c<='9'){
      zahl = zahl + c;
      parsen = true;
    }
    else if (parsen) break; // keine Ziffer mehr, Zahl zu Ende
  }
  return zahl;
}

Zahlen aus Strings zu extrahieren ist nicht immer ganz einfach, in Java gibt es eine Methode parseInt(), die einen String in einen Integer umwandelt. Sind allerdings im String weitere Buchstaben enthalten gibt die Methode einen Fehler aus.

Eine Methode ersteZahl(s:Text):Text gibt die erste ganze Zahl als String zurück.

Erstellen Sie ein Struktogramm für ersteZahl(s:Text):Text

Lösung.. Struktogramm

Entwickeln Sie das Struktogramm für eine Methode ermittleErsteZahl(s:Text):GZ ohne Verwendung von parseInt().

Lösung.. Struktogramm

Aufgaben

Die Aufgabenstellungen sollen ohne "besondere" Java-Funktionen gelöst werden.

Anzahl eines Buchstabens in einem String zählen (leicht-mittel)

anzahlBuchstaben(s:Text, c:Zeichen):GZ Die Anzahl des Buchstabens c wird im String s gezählt.

Struktogrammlösung.. Struktogramm

anzahlBuchstabenInsesitiv(s:Text, c:Zeichen,g:Bool):GZ Die Anzahl des Buchstabens c wird im String s gezählt, dabei Gross-Kleinschrift nicht relevant. [Quelltexte]

Struktogrammlösung.. Struktogramm

String umdrehen (leicht)

umdrehen(s:Text):Text dreht den Inhalt um, Bsp.: umdrehen("Hallo")=>"ollaH"

Quelltextlösung
static String umdrehen(String s){
  int i;
  String t="";
  for(i=s.length()-1;i>=0;i--){
    t=t+s.charAt(i);
  }
  return t;
}
Struktogrammlösung.. Struktogramm

Buchstaben in String ersetzten (leicht)

ersetzeZeichen(quelle:Text,a:Zeichen,b:Zeichen):Text Buchstabe a soll in quelle durch Buchstabe b ersetzt werden: ersetzeZeichen("Hallo Hugo",'H','B') -> "Ballo Bugo".

Struktogrammlösung.. Struktogramm

Zähle Token in String (mittel)

anzahlToken(s:Text,t:Text):GZ ermittelt die Anzahl der Strings token in einem String s Bsp: anzahlToken("haha Haus Hand","ha")=> 4

Quelltextlösung
static int anzahlToken(String s,String t){
  int i,k=0,anzahl=0;
  s = s.toLowerCase();
  t = t.toLowerCase();
  for(i=0;i<s.length();i++){
    if(s.charAt(i)==t.charAt(k)){
      k++;
      if(t.length()>=k){
        anzahl++;
        k=0;
      }
    }
    else{
      k=0;
    }
  }
  return anzahl;
}
Struktogrammlösung.. Struktogramm

Formatiertes Ausgeben

1. Anna-Lena Tiramisu
2. Bert Kaesspaetzle
3. Garfield Lasagne

Formatiertes Ausgeben mit printf

In praktisch jeder Programmierumgebung gibt es Funktionen um Ausgaben zu formatieren. Hier soll die Java-Methode printf vorgestellt werden.

 1. Anna-Lena    Tiramisu
 2. Bert         Kaesspaetzle
 3. Garfield     Lasagne 

Im Formatstring kann die Reihenfolge der verwendeten Parameter umsortiert werden um z.B. flexibel auf andere Sprachen reagieren zu können.

Quellcode [AusgabePrintF/AusgPrintf.java]
public class AusgPrintf{
  static String namen[] = {"Anna-Lena","Bert","Garfield"};
  static String lieb[] = {"Tiramisu","Kaesspaetzle","Lasagne"};
 
  static void ausgeben(){
    int i;
    for(i=0;i<namen.length;i++){
      System.out.print((i+1)+". "+namen[i]+" ");
      System.out.println(lieb[i]);
    }  
  }
 
  static void ausgebenPrintf(){
    int i;
    for(i=0;i<namen.length;i++){
      System.out.printf("%2d. %-12s %s %n",i+1,namen[i],lieb[i]);
    }  
  }
}
Formatstring
Formatstring ohne Umsortierung
Formatstring mit Umsortierung der Parameter
Format-Spezifizierer Wirkung Beispiel Ausgabe
%2d Ausgabe zweistellige Dezimalzahl, rechtsbündig
printf("|%2d|%2d|%2d|%-2d|",1,10,100,1)
| 1|10|100|1 |
%-10s Ausgabe als String 10 Zeichen Platz durch - linksbündig
printf("|%5s|%-5s|","AB","BA")
|   AB|BA   |
%s Ausgabe String ohne besondere Formatierung
%n Ausgabe neue Zeile-Zeichen
%5.2f Ausgabe FKZ mit Platz für 5 Zeichen,
davon ein Komma und zwei Nachkommastellen, rechtsbündig
printf("|%5.2f|%n|%5.2f|",1.0,10.0)
| 1,00|
|10,00|

Links zur Vertiefung

printf, Formatstrings : java.sun.com/javase/6/docs/api/java/util/Formatter.html#syntax

java.sun.com/javase/6/docs/api/java/io/Console.html#printf(java.lang.String,%20java.lang.Object...)

Aufgabe

1 1,19
2 2,38 

Erstellen Sie Methode ausgebenTabelle() für formatierte Tabelle Nettopreis und Bruttopreis mit 19% Steuer.
Verwenden Sie dazu die Format-Spezifizierer d und f: "%2d %4.2f %n"

Weiteres Thema