String Probleme

Hallo Leute,

ich kapiere nicht wie Algorithmus sein soll,
Aufgabenstellung: Text soll in Blocksatz mit 20 Zeichen geschrieben werden, aber falls 20. Zeichen mitten im Wort ist, muss vor dem Wort umgebrochen werden
Bsp: EIGABE : Heute ist ein schöner Tag
AUSGABE: Heute ist ein
Schöner Tag

Ich habe schon geschafft dass bei 20. Zeichen umgebrochen wird


	public static void main(String[] args) {

		String text;
		char zeile;
		int anzahl = 0;

		Scanner sc = new Scanner(System.in);

		System.out.println("Geben Sie den Satz ein");

		text = sc.nextLine();

		for (int i = 0; i < text.length(); i++) {

			if (anzahl < 20) {
				System.out.print(text.charAt(i));
				anzahl++;
			}

			if (anzahl == 20) {
				System.out.println();
				anzahl = 0;
			}
		}
	}
}

dann habe ich mir überlegt, dass ich ein Leeres StringBuffer erstellen soll und diese 20 Zeichen drinnen Speichern . Dann von hinten bis leerzeichen Durchlaufen und das als index speichern . Dann in andere Schleife neue Text bis 20-index Durchlaufen und ausgeben…

Wenn ich da Logisch denke verliere ich ein Paar Buchstaben dadurch

ich habe bei der 31. Zeile Fehler : while((int) neueText.charAt(j)!=32) warum?

        
    
    public static void main(String[] args) {
    	
    	String text;
    	Scanner sc = new Scanner(System.in);

		System.out.println("Geben Sie den Satz ein");

		text = sc.nextLine();
    	StringBuffer neueText = new StringBuffer("");
    	
    
        int anz=0;
        int pos=0;
        for(int i = 0;i<text.length();i++)
        {
        	if(anz<20)
        	{
        		 neueText.append(text.charAt(i));
        		anz=anz+1;
        	}
        	
        	for(int j=20;j>0;j--)
        	{
        		while((int) neueText.charAt(j)!=32)
        		{
        			pos=pos+1;
        		}
        		
        		
        	}
        	for(int x=0;x<20-pos;x++)
        	{
        		System.out.println( neueText.charAt(x));
        		System.out.println();
        	}
        	if(anz==20)
        	{
        		anz=0;
        		System.out.println();
        	}
        		
        		
        }
    }
}

Sieht nach Hausaufgaben aus…
lernt Ihr das so, alles als Spaghetticode in die main zu klatschen?
Ich würde pseudo in etwa so daran gehen:

  1. Eingabe in einzelne worte splitten und in ne collection legen.
  2. Methode zum Worthinzufügen basteln, die
    a) Anzahl der Buchstaben des Wortes feststellt (evt. dafür auch extra methode) [hier evtl bedenken, was ist, wenn das Wort 30 Buchstaben hat ^^]
    b) Das Wort entsprechend mit
    oder mit " "+Wort hinzufügt
  3. Wenn fertig Ausgabe

zumind. solltest du überlegen, die verschiedenen Teilaufgaben und Werte entsprechend zu separieren.

Gruß Vanny

ganz strukturiert vorgehen, jeder seelenlos Computer kann das, wieso sich darunter einordnen?

welche Fehlermeldung, posten!
ich kann sie schon ahnen, dann überlege dochmal was in dieser Zeile passiert, es wird auf das 20. Zeichen oder so zugegriffen,
dass kann natürlich schiefgehen wenn nicht genug da,
überlege genau was dein Programm bis dahin alles geleistet hat, warum sollten 20 Zeichen da sein?
überlege auch nicht nur nur sondern VERIFIZIERE das! :

  • gib vor der Zeile (hier Schleife) die Länge des StringBuilders aus,
  • schreibe eine Log-Zeile, System.out.println() bei jedem Einfügen, wird 20x und mehr eingefügt? läuft Programm doch nicht wie gedacht?

Vertrauen (in eigene Vorstellungen) ist gut, Kontrolle (im Programmablauf) ist besser,

System.out.println() ist wichtiger als sämtliche anderen Befehle zusammen, überspitzt,
im Zweifel vor und jedem sonstigen Befehl ganzes Programm mit Zustandsausgabe vollpflastern,
oder ein Debugger :wink:

ja hast recht zuerst sagt dass Fehler daran liegt. warum sollte das Problem sein? Wenn das Problem wäre, sollte ja erste Code auch nicht funktionieren.

anz = anz + 1;

0Exception in thread “main”
1
java.lang.StringIndexOutOfBoundsException: String index out of range: 1
at java.lang.StringBuffer.charAt(StringBuffer.java:179)
at CWordWrap.main(CWordWrap.java:28)

ich habe gesehen dass in neueText ende der schleife nur ein element gespeichert ist
Das Hilft auch nicht

			for (int j = neueText.length(); j > 0; j--) {
				while ((int) neueText.charAt(j) != 32) {
					pos = pos + 1;
				}

			}
			```


Ist mein Algorithmus extrem falsch?

Wie ist die Aufgabenstellung? Soll nach 20 Zeichen umgebrochen werden, oder wenn ein Wort eine Zeile > 20 Zeichen machen würde? Was soll denn da verifiziert werden? Schleife Invariante?
Hausaufgaben, die können wir nicht beantworten, jedenfalls zumindest 1. Std. 1 Sem. nicht, außerdem hab ich keine Tastertur.
CyborgBeta
(PS: Zähler nicht kaputtmachen)

was willst du tun?
wenn erst alle Zeichen in den StringBuilder speichern, dann mache das für sich in einer Schleife,
nicht in derselben Schleife, nach Einfügen EINES Zeichens bereits den StringBuilder (mit bisher nur EINEM Zeichen) nach 20 Zeichen durchsuchen

Denkt ihr da an: StringBuilder[] sba = new StringBuilder[123];?
Irgendwie geht das besser.

Naja, extrem falsch ist etwas hart. Aber er funktioniert offensichtlich nicht und er ist super umständlich, also würde ich eher sagen: „Er ist schlecht.“

Im Grunde brauchst du nur die Methode String.substring(int startIndex, int endIndex) um aus dem Eingabestring die 1 bis n Ausgabestrings in 1 bis n Iterationen heraus zu lutschen. Die Herausforderung ist, startIndex und endIndex jeweils zu bestimmen. Wie wären die Indices bei einem Eingabestring der Länge 18? Wie bei Länge 30? Wie bei Länge 50? In der ersten Näherung wären Vielfache der Maximallänge (20, 40, …) ein guter Ansatz. Erster Sonderfall: Der Reststring ist kürzer als 20. Wie würde sich das auf endIndex auswirken? Zweiter Sonderfall: Das letzte Zeichen eines Ausgabestrings ist KEIN Leerzeichen. Wie würde man da zu einem korrekten endIndex kommen? Wie würde sich das auf den startIndex der nächsten Iteration auswirken?

Ein anderer Ansatz -wenn auch sehr grobschlächtig- wäre, den Eingabestring mittels der Methode String.split("\s+") an den Leerzeichen zu splitten. Du erhälst dann ein Array mit den einzelnen Worten als Elemente. Darüber kannst Du iterieren und Dir die Ausgabezeilen zusammenbasteln.

Wenn Du mit einem der Ansätze zurecht kommst, kannst Du Dich noch um so super Spezialfälle kümmern wie z.B.: Was tun, wenn der String länger als 20 ist, aber überhaupt keine Leerzeichen enthält, bzw ein Wort enthält, dass länger als 20 ist? (Im Deutschen mit seiner Möglichkeit, Hauptwörter beliebig aneinander zu reihen, kann das durchaus vorkommen, Beispiel: Stringzerlegungsalgorithmusfrage :wink: )