# Umlaute mit Switch-Case tauschen



## rgrenzh (11. Apr 2009)

Hallo,
ich möchte nach Eingabe zB. eines Namens den String auf umlaute überprüfen und ggf. tausch

ä = ae usw.

Ich habe das bisher mittels Switch-Case probiert. Das funktioniert aber nicht.


```
public class umlaute {

    public static void main(String[] args){

        char[] umlaute =  {'ä', 'ö', 'ü', 'ß'};
         
        
        switch(umlaute){
            case umlaute[0]: System.out.println('ae'); break;
            default;
        }
```

wie kann ich diese Funktion realisieren? Bitte um kleinen Tip.


----------



## Noctarius (11. Apr 2009)

switch / case kann vor Java 7 nicht mit Strings / Chars umgehen. Am besten realisierst du das mit einer For-Schleife über dein Array von Chars.


----------



## maki (11. Apr 2009)

chars sind eigentlich ints, das sollte nicht das Problem sein.

Ist wohl eher eine Sache des Zeichensatzes.
Woher nimmst du die Eingaben für das Programm?


----------



## Noctarius (11. Apr 2009)

@maki: echt mit chars ginge das? Oo ok wieder was gelernt


----------



## rgrenzh (11. Apr 2009)

Aus einer Eingabe. Das Programm, soll wenn es mal fertig ist aus Vor- und Zunamen ein Username erzeugen. 1er Buchstabe Vorname und die ersten 3 Buchstaben vom Nachnamen. Voher soll die Eingabe auf Umlaute geprüft werden.


```
package tests;

import java.io.*;

public class umlaute {

    public static void main(String[] args)throws IOException{

       char[] umlaute =  {'ä', 'ö', 'ü', 'ß'};
       String eingabe;

       BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
       eingabe = input.readLine();
        
        
        switch(umlaute){
            case umlaute[0]: System.out.println('ae'); break;
            default;
        }

    }
}
```


----------



## hdi (11. Apr 2009)

chars sind nur eine andere Darstellung von int, du kannst ja auch sagen:


```
char c = 97; // 'a'
```

Insofern geht natürlich auch ein switch. Aber dem TO würde ich das nicht über ein switch-Konstrukt empfehlen. Er will ja nur Zeichen in einem String austauschen. Dafür gibt es


```
string.replace("ä","ae");
```


----------



## rgrenzh (11. Apr 2009)

Habe es jetzt mal so probiert. Klappt jedoch auch nicht... Kann ja eigentlich nicht so schwer sein... ich noob 


```
package tests;

import java.io.*;

public class umlaute {

    public static void main(String[] args)throws IOException{

    String eingabe;
     
        BufferedReader input = new BufferedReader(new InputStreamReader(System.in));

        System.out.println("Bitte geben Sie Ihren Vorname ein: ");
        eingabe = input.readLine();
       
        try{
           
               if (eingabe.contains("ä")){
                    eingabe.replace("ä", "ae");
                   }

               if (eingabe.contains("ö")){
                    eingabe.replace("ö", "oe");
                   }

               if (eingabe.contains("ü")){
                    eingabe.replace("ü", "ue");
                   }

               if (eingabe.contains("ß")){
                    eingabe.replace("ß", "ss");
                   }
       
           }catch(Exception e){
            
               System.out.println("Error: " + e);
           }

    System.out.println(eingabe);
   }
}
```


----------



## faetzminator (11. Apr 2009)

wieso mit .contains() überhaupt überprüfen?

```
String[] foo = {"ä", ...};
String[] bar = {"ae", ...};
for (int i = 0; i < foo.length; i++) {
    input = input.replace(foo[i], bar[i]);
}
```
Anm.: es funktioniert bei dir nicht, weil du den Returnwert von replace einfach ins Leere geht.


----------



## Antoras (11. Apr 2009)

Zu dem Thema hätte ich gerade auch noch eine Frage:

Mir ist aufgefallen, dass die verschiedenen OS Probleme damit haben Umlaute richtig darzustellen. Bspw. ist es so, dass wenn ich in Quelltext, den ich unter Linux erstellt habe, Umlaute verwende, diese unter Windows nicht richtig dargestellt werden, vorausgesetzt ich speichere den Quelltext auf einem USB-Stick und boote dann auf das andere OS um. Sie werden einfach durch kryptische Zeichen ersetzt. Grund dafür dürfte die Zeichencodierung der unterschiedliches OS sein. Allerdings kenne ich mich da nicht aus und weiß deswegen nicht wie ich das Problem in den Griff bekommen soll.

Vorerst hab ich damit aufgehört überhaupt Umlaute in Quelltexten zu verwenden. Weiß jemand zu dem Thema was?


----------



## 0x7F800000 (11. Apr 2009)

wuerde ich nur ungerne auf zwei arrays aufteilen, lieber paare in ein array packen...
und ueberhaupt, kann man das doch auch etwas kuerzer fassen:

```
public static String killUmlaut(String s){
		for(String[] pair:new String[][]{{"ä","ae"},{"ö","oe"},{"ü","ue"}}) 
			s=s.replace(pair[0],pair[1]);
		return s;
	}
```
*hack* :bae:

@Antoras: "Zeichenkodierung der unterschiedlichen OS"? Wohl eher der unterschiedlichen Editoren? Wenn du eclipse unter Linux startest, dort was bastelst, und eclipse wieder unter Windows startest, dürfte da nicht viel schief gehen... Wenn du aber in jedem OS irgendeinen anderen Editor verwendest, der jeweils andere default-einstellungen hat, dann kriegst du evtl irgendwelchen salat... kA, habe bisher niemals irgendwas außer ascii im code verwendet, sehe keine notwendigkeit da irgendwelche umlaute einzubauen, denglisch stinkt eh^^


----------



## rgrenzh (11. Apr 2009)

Danke für die Tipps! soweit klappt es jetzt, bekomme in der Ausgabe jedoch einen Fehler. (siehe unten) Weiter werden jetzt nur die Kleinbuchstaben berücksichtigt. Gibt es dafür eine Funktion oder muss ich in die Arrays auch die Großbuchstaben einfügen. (Was warscheinlich nicht sehr elegant wäre  )


```
package tests;

import java.io.*;

public class umlaute {

    public static void main(String[] args)throws IOException{

    String vorname;
    String nachname;
    String username = null;
    String[] beforeSwitch = {"ä", "ö", "ü", "ß"};
    String[] afterSwitch = {"ae", "oe", "ue", "ss"};


        BufferedReader input = new BufferedReader(new InputStreamReader(System.in));

        System.out.println("Bitte geben Sie Ihren Vorname ein: ");
        vorname = input.readLine();

        System.out.println("Bitte geben Sie Ihren Vorname ein: ");
        nachname = input.readLine();
       
        try{

            for(int i = 0; i < vorname.length(); i++){
                vorname = vorname.replace(beforeSwitch[i], afterSwitch[i]);
                break;
            }

            for(int i = 0; i < vorname.length(); i++){
                nachname = nachname.replace(beforeSwitch[i], afterSwitch[i]);
            }
    

          }catch(Exception e){
            
               System.out.println("Error: " + e);
           }

    System.out.println(vorname + " " + nachname);
   }
}
```



```
run:
Bitte geben Sie Ihren Vorname ein: 
älfred

Bitte geben Sie Ihren Vorname ein: 
schlößer

Error: java.lang.ArrayIndexOutOfBoundsException: 4
aelfred schloesser

BUILD SUCCESSFUL (total time: 14 seconds)
```


----------



## faetzminator (11. Apr 2009)

nicht
for(int i = 0; i < vorname.length(); i++){
sondern
for(int i = 0; i < beforeSwitch.length(); i++){


----------



## rgrenzh (11. Apr 2009)

faetzminator hat gesagt.:


> nicht
> for(int i = 0; i < vorname.length(); i++){
> sondern
> for(int i = 0; i < beforeSwitch.length(); i++){



Das geht laut Netbeans nicht:

"Uncompilable source code - operator < cannot be applied to int,Array.length"


----------



## 23 (11. Apr 2009)

Wegen vorname.length(); in der zweiten Schleife musst du nachname.length() nehmen!

Mach aus deinen String Arrays bitte mal Char Arrays... das ist unsauber...

und warum ist in der ersten Schleife ein break?


----------



## Noctarius (11. Apr 2009)

Ähm hallo? Oo Ein Array hat keine Funktion length!!! Sondern eine Property length

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


----------



## 0x7F800000 (11. Apr 2009)

gast23 hat gesagt.:


> Wegen vorname.length(); in der zweiten Schleife musst du nachname.length() nehmen!


in den anderen fehler verschlimmbessert? :autsch:


> Mach aus deinen String Arrays bitte mal Char Arrays... das ist unsauber...


Lass mal sehen, wie du "ae" in ein char packen willst :reflect:


> und warum ist in der ersten Schleife ein break?


keine Ahnung. 
WO ES NICHT AUF INDEX UND REIHENFOLGE ANKOMMT LIEBER IMMER FOREACH NEHMEN!

```
public static String killUmlaut(String s){
		for(String[] pair:new String[][]{{"ä","ae"},{"ö","oe"},{"ü","ue"}}){
			s=s.replace(pair[0],pair[1]);
			s=s.replace(pair[0].toUpperCase(), pair[1].toUpperCase());
		}
		return s;
	}
```



Noctarius hat gesagt.:


> Ähm hallo? Oo Ein Array hat keine Funktion length!!! Sondern eine Property length


find ich übrigens blöd... ist eine ausnahme, für die es imho keinen besonders guten Grund gibt...  ???:L


----------



## rgrenzh (11. Apr 2009)

gast23 hat gesagt.:


> Wegen vorname.length(); in der zweiten Schleife musst du nachname.length() nehmen!




Habs geändert Fehler kommt aber immer noch

Bitte geben Sie Ihren Vornamen ein: 
Töf
Bitte geben Sie Ihren Nachnamen ein: 
Töfüß
Error: java.lang.ArrayIndexOutOfBoundsException: 4
Toef Toefuess


----------



## faetzminator (11. Apr 2009)

rgrenzh hat gesagt.:


> Habs geändert Fehler kommt aber immer noch
> 
> Bitte geben Sie Ihren Vornamen ein:
> Töf
> ...


gast23 hat auch einen völligen Sch* erzählt :lol:
Aber natürlich, es heisst weder
vorname.length();
noch
beforeSwitch.length();
sondern
beforeSwitch.length;


----------



## rgrenzh (11. Apr 2009)

faetzminator hat gesagt.:


> gast23 hat auch einen völligen Sch* erzählt :lol:
> Aber natürlich, es heisst weder
> vorname.length();
> noch
> ...



Hehe Danke! Jetzt kapier ich zwar gar nichts mehr aber es funktioniert


----------



## faetzminator (11. Apr 2009)

Strings haben eine Methode namens length, darum: string.length()
Arrays haben eine Property namens length, darum: array.length


----------



## 23 (11. Apr 2009)

nachname ist doch ein String...

und er hat in der nachnamen schleife bis vorname.length() replaced...

wo hab ich da bitte mist erzählt?

und er kann aus before ein char array machen... das kostet weniger vermutlich...


----------



## faetzminator (11. Apr 2009)

Schau dir den Code doch einfach nochmals an


----------



## 23 (11. Apr 2009)

ja before.. 

Hab gedacht er macht replaceChar


----------



## 0x7F800000 (11. Apr 2009)

gast23 hat gesagt.:


> und er hat in der nachnamen schleife bis vorname.length() replaced...
> wo hab ich da bitte mist erzählt?


die länge des arrays mit zu ersetzenden buchstaben hat weder was mit der länge des vornamens, noch mit der länge des nachnamens zu tun.


> und er kann aus before ein char array machen... das kostet weniger vermutlich...


1) 2 Arrays sind eh eine dämliche Idee gewesen, auch wenn der OP sie trotzdem übernommen hat, da bleibe ich dabei...
2) replace(char c, String s) ist undefiniert => man müsste jedes mal Strings aus buchstaben erzeugen, was ja wohl völlig sinnfrei ist.


----------



## faetzminator (11. Apr 2009)

0x7F800000 hat gesagt.:


> 1) 2 Arrays sind eh eine dämliche Idee gewesen, auch wenn der OP sie trotzdem übernommen hat, da bleibe ich dabei...


Etwa so unschön wie ein zweidimensionales Array? Natürlich könne man eine Map machen, aber ein Bisschen viel Aufwand?


----------



## 0x7F800000 (11. Apr 2009)

faetzminator hat gesagt.:


> Etwa so unschön wie ein zweidimensionales Array? Natürlich könne man eine Map machen, aber ein Bisschen viel Aufwand?


Naja, 2D array finde ich da wesentlich angebrachter... zum einen ist das kürzer, zum anderen stehen die paare immer nebeneinander. Wenn man zB 15 buchstabenkombis ersetzen wollte, und sich dann irgendwo im zweiten array verzählt, sodass die zuordnung um +-1 verschoben wird, dann kriegt man eine ziemlich durcheinandergewürfelte ausgabe, und muss dann lange zählen, bis man sieht, an welcher stelle man sich verzählt hat...

Bei 2D Array stehen die paare dagegen direkt nebeneinander, ist doch auch einfacher zu lesen.

Wozu soll hier eine map denn gut sein? Dass man mehr rechenzeit für die Hashcode-berechnung braucht? Außerdem wären da viele extrazeilen nötig...


----------



## Antoras (11. Apr 2009)

0x7F800000 hat gesagt.:


> @Antoras: "Zeichenkodierung der unterschiedlichen OS"? Wohl eher der unterschiedlichen Editoren? Wenn du eclipse unter Linux startest, dort was bastelst, und eclipse wieder unter Windows startest, dürfte da nicht viel schief gehen... Wenn du aber in jedem OS irgendeinen anderen Editor verwendest, der jeweils andere default-einstellungen hat, dann kriegst du evtl irgendwelchen salat... kA, habe bisher niemals irgendwas außer ascii im code verwendet, sehe keine notwendigkeit da irgendwelche umlaute einzubauen, denglisch stinkt eh^^


Ich arbeite nur mit eclipse und die Einstellungen synchronisiere ich immer - allerdings fällt mir gerade ein, dass ich jedes Mal wenn ich mal wieder unter Windows programmiere eine Fehlermeldung, von wegen "konnte irgendwas nicht wiederherstellen", bekomme. Vllt. sind da doch ein paar Einstellungen falsch gesetzt. Werde ich mir mal angucken.


----------

