# String: alle X Zeichen Zeilenumbruch



## kinglui (7. Jan 2011)

Hallo zusammen,

gibt es eine nette/performante Art einem String alle X Zeichen einen Zeilenumbruch zuzuführen?

Ich habe bis jetzt das:

```
String text = "The class String includes methods for examining individual characters of the sequence, for comparing strings, for searching strings, for extracting substrings, and for creating a copy of a string with all characters translated to uppercase or to lowercase. Case mapping relies heavily on the information provided by the Unicode Consortium's Unicode 3.0 specification. The specification's UnicodeData.txt and SpecialCasing.txt files are used extensively to provide case mapping.";
int laenge = text.length();
int linebreak = 45;

for(int i = 0; i<=laenge-1;i++){
			if(((i%linebreak)==0) && text.charAt(i) == ' '){
				System.out.println();
			}
			else if(((i%linebreak)==0) && text.charAt(i) != ' '){
				while(text.charAt(i) != ' '){
					i++;
					System.out.print(text.charAt(i));
					if(text.charAt(i)==' ') System.out.println();
				}
			}
			else System.out.print(text.charAt(i));
		}
```

Aber da ich jetzt innerhalb von ein paar Versuchen keine passende Lösung gefunden habe, wollte ich erstmal euch frage 


danke


----------



## Gast2 (7. Jan 2011)

kinglui hat gesagt.:


> gibt es eine nette/performante Art einem String alle X Zeichen einen Zeilenumbruch zuzuführen?



Ich weiß zwar nicht was dein Code mit Zeilenumbrüchen zu tun hat (eine Zeilenumbruch ist '\n', '\r' oder "\r\n"), aber es wäre auch nicht meine Lösung.

Ich würde:
1) StringBuilder mit dem String initialisieren
2) Ausrechnen wie of eingefügt werden muss
3) in einer For Schleife die Inserts im StringBuilder machen
4) StringBuilder mit toString wieder zurückgeben


----------



## kinglui (8. Jan 2011)

Hallo,

ich habe die println stellvertretend für \n genommen, damit ich es bei den Tests halbwegs ordentlich überblicken kann.

Das Problem bei deiner "Lösung" ist doch, dass er immer bei Punkt X umbricht, egal ob es passt, oder nicht. Er soll ja nicht mitten im Wort abschneiden.

Ich hatte einen ähnlichen Ansatz wie du, aber da schien es mir etwas komplizierter, diesen Fall auszuschließen.


danke


----------



## Herr K. (8. Jan 2011)

kinglui hat gesagt.:


> Das Problem bei deiner "Lösung" ist doch, dass er immer bei Punkt X umbricht, egal ob es passt, oder nicht. Er soll ja nicht mitten im Wort abschneiden.



Dann erweiter einfach die Lösung von fassy um ein split. Damit kannst Du die Eingabe in Token zerlegen (jeweils da wo ein Leerzeichen kommt). Aus dem einen String wird dann ein Array der einzeltoken. Jetzt erzeugst Du einen Stringbuilder aus dem ersten Token und nimmst solange das nächste Token hinzu, bis die aktuelle Zeilenlänge Deinen maximalwert übersteigt. Dann fügst Du im Stringbuilder einen Zeilenumbruch ein und setzt den Zähler für die aktuelle Länge auf null zurück. 

ungetestet:

```
String[] token = "....".split("\s");
if (token.length > 0) {
  StringBuilder result = new StringBuilder(token[0]);
  
  int lineLength = result.length();
  for (int i = 1; i < token.length; i++) {
    if (lineLength > maxLength) {
      lineLength = 0;
      result.append("\n");
    }

    result.append(token[i]);
    lineLength += token[i].length;
  }

  return result.toString();
}

return "";
```


----------

