String zweifach splitten

Nelzus

Mitglied
Hi und guten Abend!

ich habe folgendes Problem. Mir ist ein String gegeben, der wie folgt aussieht:

Java:
.--- .- ...- .-     -- .- -.-. .... -     ... .--. .- ... ... .-.-.-

Bei der ganzen Geschichte handelt es sich um einen Morse-Code. Besonders daran ist, dass nach jedem Buchstaben, der als Morse-Code dargestellt wird, eine Leerzeile erfolgt. Ist ein Wort zu Ende folgen danach drei Leerzeichen. Dementsprechend zeigt das Beispiel 3 Wörter.

Ich möchte nun diesen String zurück in einen ganzen Satz verwandeln. Die entsprechenden Methoden zum Konvertieren hab ich bereits geschrieben. Die Methode, die einen Morse-Code zu einem Buchstaben wandelt, kann aber nur mit den einzelnen Morse-Codes etwas anfangen wenn man sie aufruft, also z.B. (.---). Das heißt ich mich den gegebenen String erst einmal "splitten" um jedem Morse Code seinen Buchstaben zuweisen zu können.

Ich habe jetzt probiert den String erst einmal an den Stellen zu splitten an dem drei Leerzeichen existieren.
Java:
//Methode, die einen Morse-Code in Text wandelt.
	public String decode(String mc) {
		String ausgabe = "";
		//String nach genau 3 Leerzeichen splitten.
		String[] decode = mc.split("\\s{3}");
	
		return ausgabe;
	}

Danach hab ich also ein String-Array das quasi als Elemente die einzelnen Wörter des Satzes als Morse-Code beinhaltet. So weit so gut...
Problematisch wird es dann, wenn ich jedes String Element nochmal, an der Stelle mit einem Leerzeichen, splitten möchte um an den Morse-Code zu kommen der für einen Buchstaben steht. Ich habe es so probiert, dass ich mit einer for-Schleife die einzelnen Elemente im Array splitte. Das geht jedoch nicht weil ich die entstehenden neuen String-Elemente auch wieder nur in einem einzigen Array speichern kann. Ich bräuchte aber quasi pro Wort ein eigenes String-Array...

Ich hoffe man hat das jetzt verstanden 😀
 
Zuletzt bearbeitet:
Geht sicherlich noch deutlich performanter ... bei deinem Ansatz würde ich einfach die drei Leerzeichen durch ein " X " ersetzen und alles in ein 1D-Array packen.

Java:
Map map = {"...-", "A"}
message = message.replaceAll("\\s{3}", " X ")
ausgabe = "";
for(s : message.split("\\s")) {
	if("X".equals(s)) ausgabe += " ";
	else ausgabe += map.get(s);
}
 
Dein Ansatz ist gut und das Problem, welches du siehst, ist eigentlich gar keins.
Definiere einfach außerhalb der Schleife einen StringBuilder und füge diesem dann jedes entschlüsselte Zeichen hinzu. Dann kannst du nach jedem Schleifendurchlauf das zuletzt entschlüsselte Wort schon wieder wegwerfen. Ich dachte mir das in etwa so (nur skizziert, die Details, wie z.B. das richtige Setzen von Leerzeichen in der Ausgabe, musst du dann noch selbst ausarbeiten):

Java:
public String decode(String mc) {
    StringBuilder ausgabe = new StringBuilder();
    String [] woerter = mc.split("\\s{3}");
    for(String wort : woerter) {
        String [] buchstaben = wort.split... // hier ist was zu tun  
        for(String buchstabe : buchstaben) {
            ausgabe.append( morseToChar(buchstabe) ); // hier ist was zu tun
        }
    }
    return ausgabe.toString();;
}
 
Zuletzt bearbeitet:
Vielen Dank!

Das war genau das was ich gesucht hatte.
Mit einem zweidimensionale Array funktioniert das ganze nicht, da ich bei der Initialisierung des Arrays nicht weiß welche Höhe es haben muss. Die Wörter können ja unterschiedlich lang sein! Aber die Methode von stg hat jetzt funtktioniert. Danke nochmal 🙂

So funktioniert es einwandfrei:

Java:
//Methode, die einen Morse-Code in Text umwandelt.
	public String decode(String mc) {
		StringBuilder ausgabe = new StringBuilder();
		//String nach 3 Leerzeichen splitten
		String[] decode = mc.split("\\s{3}");
		for(String wort : decode) {
			String[] buchstaben = wort.split("\\s");
			for(String buchstabe : buchstaben) {
				 ausgabe.append(getCharacter(buchstabe));
			}
			ausgabe.append(" ");
		}

		return ausgabe.toString();
		
	}
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben