String.replace() funktioniert nicht?

pau1a

Neues Mitglied
Hallo hallo,
ich habe ein kleines Problem mit dem String.replace()-Befehl...

Hier die entsprechende Methode:

Java:
private static ArrayList<String> vergroessereAnfangsbuchstabe(ArrayList<String> woerter) {
        
        for (int i = 0; i < woerter.size(); i++) {
            for (int j = 0; j < woerter.get(i).length(); j++) {
                if(j != 0){
                    woerter.get(i).replace(woerter.get(i).charAt(j), Character.toLowerCase(woerter.get(i).charAt(j)));
                }
            }
        }
        
        return woerter;
    }

Dabei geht es mir hauptsächlich um diese Zeile:

Java:
woerter.get(i).replace(woerter.get(i).charAt(j), Character.toLowerCase(woerter.get(i).charAt(j)));

Die soll nämlich eigentlich den im ersten Teil der Klammer angegebenen char mit der kleinen Version, also zum Beispiel das 'T' mit 't', ersetzen. Das funktioniert jedoch nicht, obwohl, wenn ich beim Debuggen die Zeile markiere und mit der Maus draufgehe, mit bei einem Beispielwort Wort "VOR" auch "VoR" angezeigt wird.

Meine Frage ist also, warum wird der veränderte char nicht in das Wort in der ArrayList woerter eingefügt? Muss ich die veränderten Wörter vielleicht einfach in einer neuen ArrayList speichern?

Vielen Dank schonmal für die Antworten 🙂
LG
 
Strings sind in Java _immutable_ also unveränderlich. Jede String-Operation erzeugt immer einen neuen String. Du musst das Ergebnis von der replace-Operation also irgendwo speichern, z.B. indem du das entsprechende Element in der ArrayList neu setzt, z.B. so:
Java:
woerter.set(i, woerter.get(i).replace(woerter.get(i).charAt(j), Character.toLowerCase(woerter.get(i).charAt(j))));
 
Für einen "veränderbaren String" (wenn man das so sagen darf) verwende StringBuilder.
Der Stringbuffer bietet gute Möglichkeiten, einzelne Zeichen direkt zu ändern

Was du hier machst, sprengt eh den Rahmen. Du zerlegst das Wort in einzelne Buchstaben, änderst dann jeden Buchstaben in seine LowerCase-Schreibweise und fügst dann den Buchstaben ein ...
Wie wär's denn damit, das ganze Wort auf einmal in seine LowerCase Schreibweise zu ändern?
 
Wie schon gesagt wurde, ist jede String-Instanz unveraenderbar. Also wenn man etwas an einem String aendert, bekommt man jedes mal eine neue Instanz.

Java:
String text = "Dies ist ein Text.";
System.out.println(text); // "Dies ist ein Text."

text.replace("e", "XXX");
System.out.println(text); // "Dies ist ein Text."

String geaenderterText = text.replace("e", "XXX");
System.out.println(text); // "Dies ist ein Text."
System.out.println(geaenderterText); // "DiXXXs ist XXXin TXXXxt."

Also musst, du @httodigest gesagt hat, den aktuellen Wert in der Liste mit deinem geaenderten Wert ueberschreiben.

Hinzu kommt dass deine Logik leicht falsch ist, du iterierst ueber alle Buchstaben in dem String, und ersetzt dann den Buchstaben *im gesamten String* durch den Neuen. Also Beispiel von "abc":

Code:
for:
    index 0 "a": abc -> Abc
    index 1 "b": Abc -> ABc
    index 2 "c": ABC -> ABC

Wenn du jetzt aber Buchstaben Wiederholungen hast, "aabbaa", sieht die Sache so aus:

Code:
for:
    index 0 "a": aabbaa -> AAbbAA
    index 1 "A": AAbbAA -> AAbbAA
    index 2 "b": AAbbAA -> AABBAA
    index 3 "B": AABBAA -> AABBAA
    index 4 "A": AABBAA -> AABBAA
    index 5 "A": AABBAA -> AABBAA

Du schleifst dann also komplett unnoetig durch den String, und baust jedesmal unnoetigerweise einen neuen String auf.

Es gibt auf dem String die beiden Methoden String.toUpperCase() und String.substring(int)/String.substring(int, int) welche sich wundervoll anbieten. Du zerlegst den String vorher in den ersten Buchstaben und den Rest vom Wort, dann kannst du beide Teile direkt wandeln. Hier als Schritt fuer Schritt Beispiel:

Java:
String text = "Dies Ist Ein Text AAA!";

String ersterBuchstabe = text.substring(0, 1);
String restDesTextes = text.substring(1);

String ersterBuchstabeGrosz = ersterBuchstabe.toUpperCase();
String restDesTextesKlein = restDesTextes.toLowerCase();

String ergebnis = ersterBuchstabeGrosz + restDesTextesKlein;

System.out.println(ergebnis); // "Dies ist ein text aaa!"

Oder in etwas kompakterer Form:

Java:
String text = "Dies Ist Ein Text AAA!";
text = text.subtring(0, 1).toUpperCase() + text.substring(1).toLowerCase();
System.out.println(text); // "Dies ist ein text aaa!"

Damit ersparst du dir komplett die zweite Schleife.
 

Neue Themen


Zurück
Oben