Stringoperationen

Cosma

Aktives Mitglied
Hallo, mal wieder ich.
Ich bin bei einem Stringoperationen-Programm und komme einfach überhaupt nicht auf eine Lösung, ein paar Ansätze habe ich aber die führen ins Nichts.
Zum Programm:
Es werden 2 Strings(in meinem Fall Sätze) vom Benutzer eingegeben.
+ich soll eine Methode schreiben, die beide Strings abwechselnd durchmischt und ausgibt z.B.:
"Heute ist ein wunderschöner Tag" und "Es hat mich sehr gefreut" zu ->
HEesu thea ti smti cehi ns ewhurnnn dgeerfsrcehuetener Tag!

hier denke ich nur an eine for-Schleife, die per Zufallsindex einfach Zeichen aneinander reiht, aber das funktioniert irgendwie auch nicht wirklich..

+hänge nun beide Strings aneinander und wandle diesen neuen String in ein Array um-aus diesem String gib nun zufällig 5 Wörter aus.

Hier würde das besser passen: for-Schleife mit Zufallsindex und solange ausgeben bis es gleich 5 ist.

Java:
public class fünf {
public void random(String x, String y)
{   x.toCharArray();
    int zeichen=0; //die Variable für die 5 Zeichen
    int zufall=(int)(Math.random()*0+x.length()); //Zufallsindex
   
   do{System.out.println(x.charAt(zufall)); //Zufallsindex-Zeichen ausgeben und dann Zeichen weiterzählen, solange Zeichen kleiner als 5 sind
   zeichen++;}
while(zeichen<5);  
   
   
}
}
Aber mein Problem beim denken ist, dass ich nicht weiß wie er die ganzen Wörter nimmt und nicht nur Zeichen und wie ich es eben effizient aneinanderkette..


Für Hilfe wäre ich echt dankbar.
 

Michael...

Top Contributor
Es werden 2 Strings(in meinem Fall Sätze) vom Benutzer eingegeben.
+ich soll eine Methode schreiben, die beide Strings abwechselnd durchmischt und ausgibt z.B.:
"Heute ist ein wunderschöner Tag" und "Es hat mich sehr gefreut" zu ->
HEesu thea ti smti cehi ns ewhurnnn dgeerfsrcehuetener Tag!
Es sollen doch die Zeichen der Strings abwechselnd aneinander gereiht werden. Was willst Du dann mit einem Zufallsindex?
 

Cosma

Aktives Mitglied
Ich dachte durch zufällig, aneinandergereihte kann ich das machen. Ich hab sonst keine andere Idee, wie ich das machen kann..
 

SamHotte

Top Contributor
Vorschlag (Pseudocode):
Java:
Schleife von 0 bis zur Länge des kürzeren Strings {
    Zeichen von String 1 an die Ausgabe anhängen
    Zeichen von String 2 an die Ausgabe anhängen
}
restliche Zeichen des längeren Strings an die Ausgabe anhängen
Ausgabe ausgeben

/edit: Code-Tags
 
Zuletzt bearbeitet:

Cosma

Aktives Mitglied
Könntest du mir das vielleicht näher erklären? Denn ich versteh nicht ganz wie das dann im Endeffekt funktionieren soll... :noe: bin echt nicht gut...
 

Cosma

Aktives Mitglied
Das ist nicht angegeben.
Das Beispiel stammt von meiner letzten Schularbeit in dem Jahr. Und es steht nur das, was ich hier abgetippt habe.
 

Michael...

Top Contributor
Wenn Dir das zu schwer fällt, arbeite Dich doch in Teilschritten zum Ziel:
1. Versuche für beide Strings die einzelnen Buchstaben auszugeben.
2. Versuche für beide Strings abwechselnd die einzelnen Buchstaben auszugeben.
3. Versuche für beide Strings abwechselnd die einzelnen Buchstaben an einen neuen String anzufügen.
 

faetzminator

Gesperrter Benutzer
Und wenn die beiden Strings nicht gleich lang sind, dann muss wohl noch "der Schwanz" des längeren an den erstellten String hinzugefügt werden.
 

Cosma

Aktives Mitglied
Wenn Dir das zu schwer fällt, arbeite Dich doch in Teilschritten zum Ziel:
1. Versuche für beide Strings die einzelnen Buchstaben auszugeben.
2. Versuche für beide Strings abwechselnd die einzelnen Buchstaben auszugeben.
3. Versuche für beide Strings abwechselnd die einzelnen Buchstaben an einen neuen String anzufügen.

Du meinst zuerst die Buchstaben einzeln?
Und dann durch For-Schleife immer ein Buchstabe von dem String1 und dann von String2?
 

Michael...

Top Contributor
Ja
1. erst einmal in einer for-Schleife die Buchstaben aus String1 und in einer zweiten for-Schleife die Buchstaben aus String2 einzeln ausgeben.
2. Dann in einer gemeinsamen for-Schleife (mit geeignetem Abbruchkriterium) die einzelnen Buchstaben beider Strings ausgeben:
nimm 0. Buchstaben von String1 und gib ihn aus
nimm 0. Buchstaben von String2 und gib ihn aus
nimm 1. Buchstaben von String1 und gib ihn aus
nimm 1. Buchstaben von String2 und gib ihn aus
nimm 2. Buchstaben von String1 und gib ihn aus
...
 

Andi_CH

Top Contributor
Java:
public class Test {

	public static void main(String[] args) {
		String str = "Hello world";
		System.out.println("Variante mit zählender Schleife");
		for(int i=0; i<str.length(); i++) {
			System.out.println(str.charAt(i));
		}
		System.out.println("Variante mit Iterator");
		for(byte c : str.getBytes()) {
			System.out.println((char)c);
		}
	}
}
 

Cosma

Aktives Mitglied
So habs kurz vor euch doch hinbekommen, Entschuldigt.. Ich habe bei for Schleifen immer irrsinnige Probleme am Anfang.

Java:
public class misch {
    public void mix(String x, String y)
            
    {for(int i=0; i<x.length();i++)
    {System.out.println(x.charAt(i)); 
    for(int j=0; j<y.length();j++)
    {}
    
    
    }

Wenn ihr noch Geduld habt, ein Denkanstoß punkto der schleife, die jetzt 0.Stelle von String 1 nimmt, dann 0.Stelle von String2 uswusw wäre nett.
 

Michael...

Top Contributor
Wenn ihr noch Geduld habt, ein Denkanstoß punkto der schleife, die jetzt 0.Stelle von String 1 nimmt, dann 0.Stelle von String2 uswusw wäre nett.
Die haben wir ;-)
Eine gemeinsame Schleife über beide Strings2 darf nur über die Länge des kürzesten Strings laufen.
Danach kann man sich den Rest des längeren Strings mit substring(int) holen.

Reicht das?
 

Fu3L

Top Contributor
Der größte Denkanstoß, den ich für dich habe ist: Code-Style! Keiner Wunder, dass du for-Schleifen nicht kapierst, wenn du die Klammern und die Einrückung so vermurkst... (soll nicht so böse klingen, wies vllt tut... Soll nur deutlich sein ;))

Java:
public class Misch {
	public void mix(String x, String y) {
		for (int i = 0; i < x.length(); i++) {
			System.out.println(x.charAt(i));
			for (int j = 0; j < y.length(); j++) {
				//DO Something
			}
		}
	}
}

So siehts vernünftig eingerückt aus und mit großgeschriebenem Klassennamen.
Edit: Zur Sache siehe Vorposter ;)
 
Zuletzt bearbeitet:

SamHotte

Top Contributor
Alternativ geht auch das folgende, ergibt aber längeren Code (Schleife bis zum längeren der beiden Strings, dafür in der Schleife jeweils die Prüfung, ob der Index i noch "innerhalb" des Strings ist):
Java:
String a = "Heute ist ein schoener Tag.";
String b = "Es hat mich sehr gefreut!";
char[] ca = a.toCharArray();
char[] cb = b.toCharArray();
int lenA = a.length();
int lenB = b.length();
int max = Math.max(lenA, lenB);
StringBuilder ausgabe = new StringBuilder();
// Schleife bis zum längeren String
for (int i = 0; i < max; i++) {
	// wenn i noch "innerhalb" a - Zeichen anfügen
	if (i < lenA) {
		ausgabe.append(ca[i]);
	}
	// wenn i noch "innerhalb" b - Zeichen anfügen
	if (i < lenB) {
		ausgabe.append(cb[i]);
	}
}
// ausgeben
System.out.println(ausgabe);
 

Cosma

Aktives Mitglied
Fu3l:
Danke, das hör ich schon öfters aber ich vergesse immer darauf (;

Michael:
Ich tu mir extrem schwer mir das vorzustellen...

Ich habe jetzt die 2 Schleifen, die für beide Strings die einzelnen Zeichen ausgibt.

Punkto der kürzere String: Sollte ich da zuerst zb. per if prüfen welcher kürzer ist?
Mein größtes Problem gerade, wie ich das mit dem abwechselnden Index holen sage...
Wahrscheinlich versteh ich deshalb dann auch nicht mit dem substring.. :)
 

Fu3L

Top Contributor
Im Prinzip musst du gucken, welches der kürzere String ist.
Dann lässt du eine Schleife durchlaufen bis zum Ende des Strings. DAbei gibst du von beiden Strings immer ein Zeichen aus:

Java:
for(int i = 0; i < short.length();i++) {
  short.charAt(i);
  long.charAt(i);
}
Edit: Natürlich kann man short und long in Java nicht als Variablennamen nehmen^^

und am Ende hängst du noch den Rest des Längeren dran oder gibst ihn aus, je nach dem, was du da so machst^^
Vllt nicht genau das was du erreichen willst, aber erstmal ein Anfang.
 
Zuletzt bearbeitet:

Cosma

Aktives Mitglied
Ich mein ich kann jetzt Blödsinn reden aber wie soll ich den längeren charAt(i) machen wenn der in der for schleife nicht drinnen ist?
Kann sein dass ich nur was falsch verstehe oder etwas auslasse?
 

Michael...

Top Contributor
Ich mein ich kann jetzt Blödsinn reden aber wie soll ich den längeren charAt(i) machen wenn der in der for schleife nicht drinnen ist?
Kann sein dass ich nur was falsch verstehe oder etwas auslasse?
es hat niemand gesagt, dass Du dazu charAt() benutzen musst ;-)

Wichtig beim Programmieren ist, ein Problem in kleine für einen selbst lösbare Teilprobleme zu zerlegen. Wenn Dir das mit dem längeren String Schwierigkeiten bereitet hier ein neuer Vorschlag:
1. Versuche für beide Strings die einzelnen Buchstaben auszugeben.
2. Versuche für beide Strings abwechselnd die einzelnen Buchstaben bis zur Länge des kürzesten Strings auszugeben.
3. Führe Schritt 2 aus und gebe anschließend den Rest des längeren Strings aus (Hinweis auf z.B. substring(...) hatte ich ja schon mal gegeben)
4. Versuche für beide Strings abwechselnd die einzelnen Buchstaben an einen neuen String anzufügen.

Schritt 1 hast Du ja geschaft, nun wäre erstmal Schritt 2 dran ;-)
 

SamHotte

Top Contributor
Es soll Menschen geben, die wollen sich Lösungen selbst erarbeiten - z.B. um Programmieren zu lernen ;-) und vielleicht kommt man dabei auch noch auf eine bessere Lösung.

Full ack! Allerdings war die Ausgangsfrage "ich komme nicht auf die Lösung", und die diversen Antworten in natürlicher Sprache oder sogar Pseudocode wurden nicht verstanden. Manche lernen das Programmieren auch durch das lesen fremden Codes ... ;-)
 

Cosma

Aktives Mitglied
Es stimmt schon dass ich lieber selbst draufkommen würde aber ich komme einfach nicht weiter punkto for-Schleife und dem abwechselnden angeben der Buchstaben...

Ich lern in Informatik, leider, sehr viel auswendig, da ich echt nicht gut bin, aber bei der Lösung von SamHotte kenn ich append nicht und bei meiner Prüfung 'darf' ich Sachen verwenden, wenn ich sie erklären kann (;

Kann ich das abwechselnde angeben der Buchstaben überhaupt mit for machen?
 

SamHotte

Top Contributor
"append()" ist eine Methode der Klasse "StringBuilder". Den benutze ich nur als Hilfsklasse zum Zusammenbauen der Ausgabe. Wenn Du das Ergebnis nur ausgeben und nicht behalten möchtest, kannst Du die Ausdrücke "ausgabe.append(..)" durch "System.out.print(..) ersetzen.

Klar kannst Du das abwechselnde ausgeben mit einer for-Schleife machen. Der Knackpunkt ist Dein Umgang mit verschieden langen Strings. Zusammengefasst hast Du zwei Möglichkeiten:
1. Schleife von 0 bis zum Ende des kürzeren Strings; in der Schleife abwechselnd die Buchstaben ausgeben; nach der Schleife den Rest des längeren Strings ausgeben.
2. Schleife von 0 bis zum Ende des längeren Strings; in der Schleife prüfen, ob Du Dich noch "im" String befindest und wenn ja, den aktuellen Buchstaben ausgeben.
 

Cosma

Aktives Mitglied
"append()" ist eine Methode der Klasse "StringBuilder". Den benutze ich nur als Hilfsklasse zum Zusammenbauen der Ausgabe. Wenn Du das Ergebnis nur ausgeben und nicht behalten möchtest, kannst Du die Ausdrücke "ausgabe.append(..)" durch "System.out.print(..) ersetzen.

Klar kannst Du das abwechselnde ausgeben mit einer for-Schleife machen. Der Knackpunkt ist Dein Umgang mit verschieden langen Strings. Zusammengefasst hast Du zwei Möglichkeiten:
1. Schleife von 0 bis zum Ende des kürzeren Strings; in der Schleife abwechselnd die Buchstaben ausgeben; nach der Schleife den Rest des längeren Strings ausgeben.
2. Schleife von 0 bis zum Ende des längeren Strings; in der Schleife prüfen, ob Du Dich noch "im" String befindest und wenn ja, den aktuellen Buchstaben ausgeben.

Das ist mein Problem, wie abwechselnd? :/
 

SamHotte

Top Contributor
Einfach zwei Befehle hintereinander, erst von dem einen, dann von dem anderen String:

Java:
String a = "Heute ist ein schoener Tag.";
String b = "Es hat mich sehr gefreut!";
char[] ca = a.toCharArray();
char[] cb = b.toCharArray();
// weggelassen: laenge bestimmen
for (int i=0; i<laenge; i++){
    // Buchstabe von String a an der Stelle i ausgeben
    System.out.print(ca[i]);
    // Buchstabe von String b an der Stelle i ausgeben
    System.out.print(cb[i]);
}

/edit: Code erweitert, sodass nun hoffentlich verständlich ^^
 
Zuletzt bearbeitet:

Cosma

Aktives Mitglied
Ist es klug, die Länge per If-zu prüfen, weil so wie ich es lösen will! funktioniert das alles iwie nicht...


Java:
    {char[] xarray=x.toCharArray();
    char[] yarray=y.toCharArray();
        
        
        int laengex=x.length();
    int laengey=y.length();
      
    if(laengex<laengey){
        for(int i=0; i<laengex;i++) {
        
      System.out.print(xarray[i]);
        System.out.print(yarray[i]);}}
            
            for(int j=0; j<laengey;j++)
        else(System.out.print(yarray[j]); System.out.print(xarray[j]);)
                
                
    
        
    }
            
            
            
}
 

SamHotte

Top Contributor
Welche der beiden Lösungsmöglichkeiten möchtest Du denn bauen, die mit der "kurzen" oder die mit der "langen" Schleife?

Ich vermute mal, in Deinem Codestück meckert der Compiler ...

/edit: typo
 

Cosma

Aktives Mitglied
Ich wollte es jetzt so lösen, dass zuerst bis zum kürzeren String geht und der Rest vom Längeren dann drangehängt wird.
 

SamHotte

Top Contributor
Dann brauchst Du in der Schleife eigentlich nicht nochmal zu prüfen. Idee in Pseudocode:
Java:
wenn (a kürzer als b) {
    Schleife über die Länge von a {
        a[i] ausgeben
        b[i] ausgeben
    }
    Rest von b ausgeben
} andernfalls {
    Schleife über die Länge von b {
        a[i] ausgeben
        b[i] ausgeben
    }
    Rest von a ausgeben
}
 

Cosma

Aktives Mitglied
Obwohl eine klitzekleine Frage hätte ich noch weil dann hätt ich das Programm endlich fertig : )

Java:
String neu=x+y;
    
    String[] splitarray=neu.split(" ");
    
    int zufallsindex=(int)(Math.random()*splitarray.length+0);
    int anzahl=0;
   while(anzahl<5)
   {System.out.println("Ihre 5 Wörter:"+splitarray[zufallsindex]); anzahl++;}
Hier speichere ich die Wörter der beiden Strings in ein Array und will per Zufallsindex 5 Wörter ausgeben. Er macht auch ein zufälliges Wort, aber das nimmt er dann einfach 5 mal ?
 

Fu3L

Top Contributor
Du änderst ja auch nicht die Zufallszahl^^ Nur weil Zufall dransteht, muss kein Zufall drin sein ;)

PS: Einrückung, sonst liest es bei längerem Code keiner mehr ;)
 

Fu3L

Top Contributor
Java:
String neu=x+y;
    
    String[] splitarray=neu.split(" ");
    
    int anzahl=0;
    while(anzahl<5) {
    	int zufallsindex=(int)(Math.random()*splitarray.length);
	   System.out.println("Ihre 5 Wörter:"+splitarray[zufallsindex]);
	   anzahl++;
	 }

So würde es zB gehen ;)

(Einrückung nur etwas verschönert, weil mit Fehlern (mir fehlen ja Variablen und co), kann Eclipse anscheinend net formatieren und per Hand wollt ichs auch net zu ordentlich machen ;))
 

Oben