Stringwerkmeister

Panda9296

Bekanntes Mitglied
Hi Leute es geht um folgende Aufgabe:

Schreibe einen Speiseplanhacker, der alles, was mit "Dinkel" anfängt, gegen etwas Leckeres ersetzt. Der String bzw. das Rezept, welches ersetzt werden soll, soll durch eine Eingabe eingegeben werden. Danach muss er überprüft werden und so weiter. Ich muss wirklich gestehen ich komme bei diesem Thema ein wenig / heftig ins schwitzen... irgendwas hab ich nicht verstanden naja erstmal das was ich hier mal zeigen möchte:

Code:
package de.schroedinger100.miguel.java;

import java.io.*;
import java.util.*;

public class schroedinger {

    public static void main(String[] args)throws Exception  {
    
    BufferedReader br= new BufferedReader(new InputStreamReader(System.in));     // ok Scanner dürfte ****e sein, also BufferedReader. Ich möchte das Gericht reinschreiben in die Konsole 
    String speise;
    while((speise = br.readLine())!=null) {                                                                  /* Wenn der String gelesen wird...
         if(speise.startsWith("Dinkel")||speise.endsWith("dinkel")) {                             */ Soll ein Muster erkannt werden,nämlich 3x darfste raten.... Dinkel muss enthalten sein
           String a = speise.replace("Dinkel", "Hamburger");                                      // und hier will ich es ersetzen alles was mit Dinkel beginnt oder endet soll durch Hamburger ersetzt werden(müsste ich mal meine Freundin zeigen wie das geht, dann gibts vielleicht mehr Fleisch) So aber wo ist der Fehler 
          
    }System.out.println(speise);           // Denn nach der blöden Eingabe gibt er mir das Wort zurück anstatt es zu ersetzen.
  }
    
}   
}
 

Panda9296

Bekanntes Mitglied
Habs ich hab ne halbe Stunde geschaut und warum komme ich auf die Idee einen neuen String zu belegen -.- . Habt ihr vielleicht Tipps diese komplexe Art von primitiven Datentypen besser zu meistern.
 
K

kneitzel

Gast
Also Strings sind unveränderlich in Java. Siehe dazu auch https://docs.oracle.com/javase/7/docs/api/java/lang/String.html ("Strings are constant; their values cannot be changed after they are created.")

Daher ist der String, der in speise drin ist, erst einmal fix. Und das ist auch der Grund, warum die replace Methode nicht den String verändert sondern einen neuen String zurück gibt.

Den neuen String kannst Du natürlich in der gleichen Variable speichern:
speise = speise.replace("Dinkel", "Hamburger");

Aber da der neue String in a gespeichert wird, ist speise natürlich noch immer die eingegebene Speise.
 

athkougr

Mitglied
Hallo,
bei sollchen Problemen erstelle ich mir meisten eine StringBuilder-Variable wo die Daten dort gespeichert werden. Am Ende rufe ich halt die toString ()-Methode auf um einen String zurückzugeben. Also sowas in der Art:

Java:
StringBuilder builder = new StringBuilder();

while(speise = br.readLine() != null) {
    if(speise.startsWith("Dinkel"))
        builder.append("Hamburger");
    else
        builder.append(speise);
}

System.out.println(builder.toString());

Somit bleibt der ursprüngliche String unverändert und in der StringBuilder-Variablen ist der neue String mit den Änderungen abgespeichert.
 

mihe7

Top Contributor
der alles, was mit "Dinkel" anfängt, gegen etwas Leckeres ersetzt.
Endlich mal eine Anwendung, die sich in der Praxis durchsetzt :)

Habs ich hab ne halbe Stunde geschaut und warum komme ich auf die Idee einen neuen String zu belegen
Dass Strings unveränderlich sind, hat einen tieferen Sinn. Dadurch ist es möglich, gleiche Strings nur einmal (in einem Pool der JVM) zu speichern, ohne Gefahr zu laufen, dass durch eine Änderung plötzlich sich Strings ändern, die an ganz anderen Stellen in der Software verwendet werden. So wird für gleiche Literale auch immer nur ein String-Objekt verbraten.

Beispiel:
Java:
String a = "Gleich";
String b = "Gleich";
String c = new String("Gleich");
String d = c.intern();

System.out.println(a == b);
System.out.println(a == c);
System.out.println(a == d);
Der Referenzvergleich a == b liefert true, weil für die beiden Literale das gleiche String-Objekt (aus dem Pool) verwendet wird.
Der Referenzvergleich a == c liefert false, weil für c ein neues String-Objekt erzeugt wird.
Der Referenzvergleich a == d liefert true, weil für d der String c in den Pool der JVM gelegt wird; da dort der String "Gleich" schon vorhanden ist (die Literale), wird die Referenz darauf zurückgegeben.
 

Panda9296

Bekanntes Mitglied
Hallo,
bei sollchen Problemen erstelle ich mir meisten eine StringBuilder-Variable wo die Daten dort gespeichert werden. Am Ende rufe ich halt die toString ()-Methode auf um einen String zurückzugeben. Also sowas in der Art:

Java:
StringBuilder builder = new StringBuilder();

while(speise = br.readLine() != null) {
    if(speise.startsWith("Dinkel"))
        builder.append("Hamburger");
    else
        builder.append(speise);
}

System.out.println(builder.toString());

Somit bleibt der ursprüngliche String unverändert und in der StringBuilder-Variablen ist der neue String mit den Änderungen abgespeichert.
danke =) ja das kommt jetzt in meinem Buch als nächstes(ich lerne mit Schrödinger programmiert Java). DIese Übung soll die Sensibilität des Strings näher bringen ^^
 

Neue Themen


Oben