# Vokale im String ersetzen



## alphaboy (11. Mrz 2011)

Hallo,
wir haben gestern in der Schule die Aufgabe bekommen, alle Vokale in einem String durch ein "a" zu ersetzen und zwar so, dass wir nicht jeden einzelnen Buchstaben mit 
String.replace("vokal","a") 
ersetzen, sondern das soll in einer Schleife passieren.
ich hab schon das folgende ausprobiert.

```
//String eingeben
String s = br.readLine();
String v = eiou;
for (int i=0;i<s.length();i++)
{
   s = s.replace(v.charAt(i),"a")
}
```

Allerdings kommt hier ein Fehler, weil " v.charAt(i)" kein String ist (glaub ich zumindestt)

Ich frag mich wie man das sonst machen könnte.

Ich bedanke mich schon im voraus für jede hilfreiche Antwort

lg,
alphaboy


----------



## Runtime (11. Mrz 2011)

Strichpunkt fehlt in Zeile 6
 s = s.replace(v.charAt(i),"a") muss zu s = s.replace(v.charAt(i),'a') geändert werden, weil nur String.replace(String, String) und String.replace(char, char) existiert und nicht String.replace(char, String).


----------



## Volvagia (11. Mrz 2011)

Exceptions und Errors sind doch so hübsch, warum schaut da nur jeder 5. drauf? Und die JavaDoc erst. replace braucht 2 Chars als Parameter, für Strings heißt die Methode replaceAll.

Ich würde mir ein Array mit allen Chars die ersetzt werden sollen anlegen und es durchlaufen, wäre imho erblich hübscher.

Übrigens, Strings werden mit Anführungszeichen intialisiert.
Edit, die warscheinlich 100derste: Und wärend dem Schleifendurchlauf wird dir ebenfalls eine Exception fliegen, falls die Eingabe länger als er String mit den Vokalen ist.


----------



## HoaX (11. Mrz 2011)

Du solltest mal überlegen was jetzt in deiner Schleife passiert:
Du extrahierst _ein_ Zeichen aus dem String, dann ersetzt du dieses evtl durch ein anderes, und dann überschreibst du deinen gesamten Anfangsstring durch ein einziges Zeichen ...

Als Tipp von mir zur Lösung: String#toCharArray() in ein Array speichern, dann dieses Array durchgehen und einen neuen String zeichen für Zeichen aufbauen indem du entweder ein 'a' oder das Zeichen aus dem Array verwendest.


----------



## HoaX (11. Mrz 2011)

[Edith sagt: Hoax hatte was falsch gelesen ...]


----------



## Haave (11. Mrz 2011)

[JAVA=3]String v = eiou;[/code]
sollte wohl eher 

```
String v = "eiou";
```
sein.

Edit: Okay, wurde soeben von Volvagia in seinem 1000. Edit auch erwähnt *g*


----------



## Volvagia (11. Mrz 2011)

HoaX hat gesagt.:


> @Runtime: Du weißt schon, dass dann der resultierende String nur aus "a"s besteht?


Dachte ich am Anfang auch, stimmt aber nicht, da er sich die Chars zum ersetzen aus v und nicht s hohlt. ^^


----------



## alphaboy (11. Mrz 2011)

Leute Meine Güte ^^ Der Code steht nich so bei mir im Programm. Hab ihn vom Kopf aus geschrieben.
Es sollte nur die grobe Struktur des Programms wiedergeben. Semikolons kann ich schon setzen^^



> Edit, die warscheinlich 100derste: Und wärend dem Schleifendurchlauf wird dir ebenfalls eine Exception fliegen, falls die Eingabe länger als er String mit den Vokalen ist.



Das kann ich ja leicht beheben, indem ich einfach zwei verschachtelte for-Schleifen nehme oder nich?

Danke, das  mit den einfachen Anführungszeichen hatte ich probiert aber ich hab die falschen neben den scharfen ß genommen ^^. Jetz gehts vielen Dank


----------



## Volvagia (11. Mrz 2011)

alphaboy hat gesagt.:


> Das kann ich ja leicht beheben, indem ich einfach zwei verschachtelte for-Schleifen nehme oder nich?



Nein, dein Source würde die Schleife so oft, wie Buchstaben in der Eingabe sind durchlaufen. Irgendwann sollte er einen Char hohlen wollen, der garnicht existiert, da v zu kurz ist. (Hoffentlich habe ich es jetzt gut aber so erklärt, dass du auch darüber nachdenkst und verstehst.)

Du musst unterscheiden:
" - Anführungszeichen, definieren Strings, also ein Array aus Chars.
' - Apostroph, definiert ein einzelnes Char.
´` - Akut/Gravis geben glaub ich Akzente wieder, und wenn du keins auf einen Buchstaben brauchst haben sie keine Bedeutung in Java.


----------



## alphaboy (11. Mrz 2011)

@Volvagia
Ich hatte mir das so vorgestellt dass ich in der äußeren Schleife, die bis s.length() geht, einen char extrahiere und ihn dann in der inneren Schleife wenn es ein Vokal ist durch a ersetze.


----------



## Volvagia (11. Mrz 2011)

Ich würde es mit einen Array machen. (Psydocode, wills dir ja nicht zu leicht machen)


```
private static final char[] REPLACE_CHARS = {
	'a', 'e', 'i', 'o', 'u'
};

...
String eingabe = ...
for(char c:REPLACE_CHARS)
	s = s.replace(c, 'a');
```

Oder: (Idee von HoaX)


```
private static final char[] REPLACE_CHARS = {
	'a', 'e', 'i', 'o', 'u'
};

String eingabe = ...
char[] chars = eingabe.toCharArray();
for(int i = 0, size = chars.lenght; i < size; i++)
{
	char c = chars[i];
	for(int j = 0; j < REPLACE_CHARS.lenght; j++)
	{
		char repChar = REPLACE_CHARS[j];
		if(repChar == c)
			chars[i] = 'a';
	}
}
eingabe = new String(chars);
```

Die 2. Variante ist vermutlich wesendlich schneller.


----------



## alphaboy (11. Mrz 2011)

Danke ich werds mir morgen nochmal in Ruhe angucken. Ich hab ja schließlich noch nen Real Life 

PS: Strings erscheinen mir lieber. Jetz habe ich alle .charAT´s mit .substrings ersetzt.

Die schleifen sahen dann so aus:


```
for (i=0;i<L;i++) //L ist die Länge von S1, das ist der eingegebene String
    {
      S2 = S1.substring(i);
      for(int j = 0;j<4;j++)
      {
        S2 = S2.replaceAll(V.substring(j),"a");
      }
      [B]S1 = S2 + S1.substring(i);[/B]

    }
```
Die letzte Zeile ist noch sinnlos, muss ich noch korrigieren, aber die Idee ist gut oder?
Und entschuldigt wenn ich da Quatsch hingeschrieben hab,mein gehirn ist schon total ermüdet, sitze schon seit 6-7 Stunden an Java rum


----------



## Volvagia (11. Mrz 2011)

alphaboy hat gesagt.:


> sitze schon seit 6-7 Stunden an Java rum



Wer nicht? :bae:
Aber ich würde definitiv die Chars nehmen. String können nicht verändert werden, das heißt er muss theoretisch bei jeden Schleifendurchlauf 4 neue Strings erzeugen. (1x Zeile 3, 2x Zeile 6, 1x Zeile 8.)
Ob die StringCache verwendet wird weiß ich nicht, es dürften aber auf jeden Fall einige sein, was man vermeiden kann.
Übrigens gibt String#substring(int) nicht nur das Zeichen als String, sondern String#substring(int, String#lenght) zurück.


----------

