Langen String umbrechen

Status
Nicht offen für weitere Antworten.

Scrat

Mitglied
Hallo,
ich scheitere im Moment an folgender Aufgabe.

Von einer JTextArea hole ich per getText() einen beliebigen Text, der Zeilenumbrüche (\n) enthalten darf. Aus diesem String erzeuge ich ein Array per split("\\n"). So weit, so gut.

Nun möchte ich einzelne Zeilen des Arrays auf ihre Länge hin überprüfen. Sollte eine dieser Zeilen mehr als 100 Zeichen haben, soll diese Zeile in eine oder, wenn nötig, mehrere Zeilen aufgeteilt werden, so dass keine der neuen Zeilen länger ist als 100 Zeichen. Dabei soll außerdem darauf geachtet werden, dass nicht etwa mitten in einem Wort umgebrochen wird.

Trotz Suche in diesem und anderen Boards hab ich bisher keine Lösung hinbekommen. Kann mir jemand hier helfen?

Vielen Dank schon einmal.
 
ist die Aufgabe denn nicht durch schieres Denken zu lösen?

du musst offensichtlich den String nach Positionen von Leerzeichen durchsuchen,
und dann eine dieser Positionen als Schnitt wählen,

einfache String-Methoden?
 
Ungetestet:
Java:
String[] lineArray = field.getText().split(...);
List<String> lines = new ArrayList<String>();
for(String line : lineArray) { lines.add(line); }
for(int i = 0; i < lines.size(); i++) {
   while(lines.get(i).length > 100) {
       if(i + 1 == lines.size()) { lines.add(""); }
       int index = lines.get(i).lastIndexOf(" ");
       if (index < 0) throw new IllegalArgumentException("No space found. What now???");
       String start = lines.get(i).substring(0, index);
       String end = lines.get(i).substring(Math.min(index + 1, lines.get(i).length - 1));    
       lines.set(i, start);
       lines.set(i+1, end + " " + lines.get(i+1); 
   }
}
 
ok, ich sehe es ein,

in diesem Forum muss man nur seine Aufgaben reinstellen und andere machen lassen 😉
 
Habe heute meine Spendierhosen an. Morgen bist du dran!

Außerdem habe ich in obigem Post aus didaktischen Gründen drei Fehler versteckt. Wer sie findet, darf sie auch behalten!
 
@SlaterB: Ich habe mich durchaus mit dem Problem beschäftigt. Mein Hauptproblem war weniger das Suchen nach Positionen von Leerzeichen, sondern die Behandlung eines Strings, der beispielsweise grösser ist als 200, so dass die Operation mehrfach ausführbar ist. Da hat Landei einen wertvollen Hinweis geliefert.

Ich habe diesen Thread bewusst in ein Anfängerforum geschrieben, weil ich genau das bin. Anscheinend sind Anfängerfragen aber dann doch nicht gewünscht. Seis drum. Dann vielleicht aber trotzdem noch eine letzte Frage an dich als Moderator, SlaterB. Ich habe keine Funktion gefunden, mit der man den eigenen User-Account hier löschen kann. Ist dafür ein Admin anzusprechen?

@Landei: Vielen Dank, das funktioniert. Ich möchte bzw. werde den Code trotzdem etwas weiterbearbeiten, und zwar so, dass die while-Schleife nicht immer nur einzelne Worte in die nächste Zeile schiebt, sondern Blöcke von bis zu hundert Zeichen. Mal schauen, was geht.
 
> Ist dafür ein Admin anzusprechen?

jo,
java-forum.org - Profil ansehen: L-ectron-X

wenn möglich aber nicht, das ist ja manuell etwas Arbeit,
wenn das jeder machen würde.. 😉

andererseits hilft die Anfrage vielleicht dahingehend, dass diese Option bald jedem selber zur Verfügung steht
 
Ich habs jetzt in letzter Instanz so gelöst (Java 4).

Java:
        String oneString = textArea.getText();
        String[] oneStringArray = oneString.split("\\n");

        List lines = new ArrayList();
        for(int i=0; i < oneStringArray.length; i++) {
            lines.add(oneStringArray[i]);
        }
        
        int maxCharSize = 100;
        for(int i = 0; i < lines.size(); i++) {
            String currentLine = (String)lines.get(i);
            if(currentLine.length() > maxCharSize) {
                if(i + 1 == lines.size()) {
                    lines.add("");
                }
                String firstStringBlock = currentLine.substring(0, maxCharSize);
                int index = firstStringBlock.lastIndexOf(" ");
                index = (index < 0) ? maxCharSize : index ;
                String start = firstStringBlock.substring(0, index);
                String end = currentLine.substring(index+1);    
                lines.set(i, start);
                lines.set(i+1, end); 
            }
        }
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben