Erste Schritte Eingelesenen Satz - Wörter und Leerzeichen getrennt in 2x Array's

The_Virus

Mitglied
Ich habe mal wieder eine Aufgabe für die Uni zu lösen, dabei soll ich einen Satz mit beliebig vielen Leerzeichen zwischen den Wörtern in ein Array einlesen. Da ich die Leerzeichen aber brauche, sollen diese auch in ein zweites Array bzw. die Anzahl der Leerzeichen.
Bsp.
Code:
"  das    ist das      Haus   vom Nikolaus"
Leerzeichen: 2 - 4 - 1 - 6 - 3 - 1

In das Wort Array soll:
[0] das
[1] ist
[2] das
[3] Haus
[4] vom
[5] Nikolaus

In das Leerzeichen Array soll:
[0] 2
[1] 4
[2] 1
[3] 6
[4] 3
[5] 1

Das reine Wort Array habe ich sogar hinbekommen, wenn auch sehr umständlich, wie ich finde:
Java:
	private String satz;
	private String[] wort;
	private String[] keinLeer;	

		public void einlesen() {
		Scanner einlesen = new Scanner(System.in);
		System.out.println("Bitte geben Sie einen Satz ein!");
		satz = einlesen.nextLine();
		wort = satz.split(" ");
	}
	
	public void arrayOhneLeerzeichen() {
		// Laenge von keinLeer[]
		int zaehler1 = 0;
		for (int h = 0; h < wort.length; h++) {
			if(wort[h].equals("") == false) {
				zaehler1++;
			}
		}
		// keinLeer[] fuellen
		keinLeer = new String[zaehler1];
		int zaehler2 = 0;
		for (int i = 0; i < wort.length; i++) {
			if(wort[i].equals("") == false) {
				keinLeer[zaehler2] = wort[i];
				zaehler2++;
			}
		}		
	}
Zu dem Leerzeichen Array brauche ich Hilfe. Versuch das nun schon mehrere Stunden. :-(
 
Zuletzt bearbeitet:
auf split() verzichte besser, das sieht nach Cheaten aus,

erstelle anfangs zwei große Arrays, ruhig so groß wie der String lang ist,
dann nur ein Durchlauf,
baue ein aktuelles Wort zusammen, Zeichen für Zeichen, vergleiche jeweils das aktuellen Zeichen mit diesem Wort,

je nachdem ob das aktuelle Zeichen ein Leerzeichen ist oder nicht, und das nebenher aufgebaute Wort nur Leerzeichen oder gerade nicht Leerzeichen enthält, das Wort weiter aufbauen oder in eines der beiden Arrays einfügen und ein neues Wort beginnen,
also auf die Wechsel achten, nebenher mitzählen wie der Stand in beiden Arrays ist

wenn es sein muss diese Schleife quasi zweimal durchlaufen, beim ersten Mal nur zählen um dann Arrays in der richtigen Größe zu erstellen,
ansonsten am Ende wahrscheinlich von den großen Arrays auf passende umkopieren
 
ich würde die anzahl der delimiter und den token mappen. am besten in einer inner class oder so. finde "index-mapping" nämlich etwas unschön.

z.b.:
Java:
import java.util.ArrayList;
import java.util.List;

public class SplitCount {

	private char delimiter;

	public SplitCount(char delimiter) {
		this.delimiter = delimiter;
	}

	public Token[] split(String str) {
		List<Token> tokens = new ArrayList<Token>();
		StringBuilder sb = new StringBuilder();
		int delimCount = 0;
		for (char c : str.toCharArray()) {
			if (c == delimiter) {
				if (sb.length() > 0) {
					tokens.add(new Token(sb.toString(), delimCount));
					sb.setLength(0);
					delimCount = 0;
				}
				delimCount++;
			} else {
				sb.append(c);
			}
		}
		if (sb.length() > 0) tokens.add(new Token(sb.toString(), delimCount));
		return tokens.toArray(new Token[tokens.size()]);
	}

	public class Token {
		
		public int preDelims;
		public String token;
		
		public Token(String token, int preDelims) {
			this.token = token;
			this.preDelims = preDelims;
		}
	}
	
	// Testmain
	public static void main(String[] args) {
		SplitCount sc = new SplitCount(' ');
		for (Token t : sc.split("  das    ist das      Haus   vom Nikolaus"))
			System.out.println(t.token + " hat " + t.preDelims + " führende delimiter");
	}
}

delimiter nach dem letzten token werden dabei ignoriert.

edit: so ists bissle schöner
 
Zuletzt bearbeitet:
Danke schonmal euch beiden.

@SlaterB:
Warum ist split() cheaten?
Deinen Lösungsvorschlag verstehe leider nicht so ganz, weiß nicht so recht wie das als Code aussehen soll. Werde mich daran aber morgen nochmal versuchen.

@nrg:
Dein Lösungsvorschlag ist zu weit fortgeschritten für mich. Ich bin blutiger Java-Anfänger, mache das seit 9 Wochen oder so. Ich verstehe weder was token / delimiter mappen bedeutet, noch was index-mapping ist.

Über weitere Vorschläge würde ich mich freuen. So einfach gehalten wie nur möglich!
 
Zuletzt bearbeitet:
eine Aufgabe zum Auftrennen eines Satzes in Bestandteile klingt nun mal genau nach Schleifen usw. wie deine umständliche Variante schon aussieht,
es macht keinen Sinn da eine einzelne API-Methode als Antwort hinzuschreiben, was soll das als Lernergebnis zeigen?

und das auch noch schlecht zu machen so dass danach immer noch lange Schleifen kommen müssen zeigt nur dass split() nicht mal gut bedient werden kann,
[c]split(" +")[/c] etwa würde die erste Teil-Aufgabe fast komplett lösen, die zweite mit einem anderen RegEx-Ausdruck,
wobei dies beides freilich noch eine Stufe höher ist als nur split() nach einem Zeichen,
 
Zuletzt bearbeitet von einem Moderator:
Ok Ok, also ohne split(). Ich werds versuchen und mich morgen nochmal melden...

EDIT:
Weil du so auf den Lerneffekt gepocht hast. Die von mir oben genannte "Aufgabe" ist natürlich nicht die komplette Aufgabe, das ist nur ein Teil einer Aufgabe. Das hier soll am Ende dabei rauskommen:
Übungsblatt "Arrays"
Für die Ausgabe brauche ich die beiden Arrays.
 
Zuletzt bearbeitet:

Zurück
Oben