2009-06-23 8 views
3

Ich habe einen großen Textblock (200+ Zeichen in einem String) und muss nach 30 Zeichen neue Zeilen einfügen, um Wörter zu erhalten. Hier ist, was ich habe jetzt (nicht funktioniert):JAVA - Einfügen einer neuen Zeile in das nächste Leerzeichen nach 30 Zeichen

String rawInfo = front.getItemInfo(name); 
String info = ""; 
int begin = 0; 
for(int l=30;(l+30)<rawInfo.length();l+=30) { 
    while(rawInfo.charAt(l)!=' ') 
     l++; 
    info += rawInfo.substring(begin, l) + "\n"; 
    begin = l+1; 
    if((l+30)>=(rawInfo.length())) 
     info += rawInfo.substring(begin, rawInfo.length()); 
} 

Vielen Dank für jede Hilfe

+0

Also, was ist die Frage? Funktioniert das oder nicht? –

+0

Tut mir leid, es funktioniert nicht, ich werde die Frage bearbeiten –

+3

Übrigens ist die korrekte Großschreibung "Java", nicht "JAVA" - aber das Tag ist in der Regel ausreichend, um die Leute wissen, welche Plattform Sie interessiert sind. – erickson

Antwort

16

Wie kdgregory vorgeschlagen, eine StringBuilder Verwendung wäre wahrscheinlich ein einfacher Weg sein, mit String-Manipulation zu arbeiten.

Da ich nicht sicher war, ob die Anzahl der Zeichen vor dem Zeilenumbruch das Wort vor oder nach 30 Zeichen ist, entschied ich mich für das Wort nach 30 Zeichen, da die Implementierung wahrscheinlich einfacher ist.

Der Ansatz besteht darin, die Instanz des " " zu finden, die mindestens 30 Zeichen nach dem aktuellen Zeichen auftritt, das mit StringBuilder.indexOf angezeigt wird. Wenn ein Leerzeichen auftritt, wird \n von StringBuilder.insert eingefügt.

(Wir nehmen an, dass hier eine neue Zeile \n ist - der tatsächliche Zeilentrenner, der in der aktuellen Umgebung verwendet wird, kann durch System.getProperty("line.separator"); abgerufen werden).

Hier ist das Beispiel:

String s = "A very long string containing " + 
    "many many words and characters. " + 
    "Newlines will be entered at spaces."; 

StringBuilder sb = new StringBuilder(s); 

int i = 0; 
while ((i = sb.indexOf(" ", i + 30)) != -1) { 
    sb.replace(i, i + 1, "\n"); 
} 

System.out.println(sb.toString()); 

Ergebnis:

 
A very long string containing many 
many words and characters. Newlines 
will. 

sollte ich hinzufügen, dass der obige Code außer für das Beispiel wurde erprobt, nicht String, die ich in der gezeigt habe Code. Es wäre nicht überraschend, wenn es unter bestimmten Umständen nicht funktionieren würde.

bearbeiten

Die Schleife in dem Beispielcode durch eine while Schleife statt einer for Schleife, die in diesem Beispiel nicht sehr geeignet war ersetzt worden.

Auch die StringBuilder.insert Methode wurde durch die StringBuilder.replace Methode ersetzt, wie Kevin Stich in den Kommentaren erwähnt, dass die replace Methode anstelle der insert verwendet wurde, um das gewünschte Verhalten zu erhalten.

+0

Diese Methode funktionierte perfekt, nur geändert sb.insert (i, "\ n"); bis sb.replace (i, i + 1, "\ n"); Danke! –

+0

@Kevin Stich: Ich habe den Beispielcode aktualisiert - die for-Schleife war in diesem Beispiel nicht sehr geeignet, also wurde sie durch eine while-Schleife ersetzt. – coobird

2

Eine bessere Lösung: Kopieren Sie die Zeichenfolge in einen Stringbuilder, so dass Sie eingeben/ändern Zeichen ohne viel Teilzeichenfolge Ausmisten . Verwenden Sie dann die indexOf() -Methode, die eine Startposition verwendet, um den zu ändernden Index zu finden.

Edit: teh codez:

public static String breakString(String str, int size) 
{ 
    StringBuilder work = new StringBuilder(str); 
    int pos = 0; 
    while ((pos = work.indexOf(" ", pos + size)) >= 0) 
    { 
     work.setCharAt(pos, '\n'); 
    } 
    return work.toString(); 
} 
+0

Ich denke, wenn Sie POS innerhalb der while-Schleife nicht erhöhen, werden Sie versehentlich jedes Leerzeichen mit \ n ersetzen, was dazu führt, dass alle Zeilen nach dem ersten ein Wort haben. Du musst dich nach jeder Auswechslung um 30 erhöhen. – Karl

+0

schauen Sie sich den Ausdruck while genauer an - er aktualisiert pos – kdgregory

1

Ich würde über die Zeichenfolge statt der 30 iterieren. Sie müssen jedoch die 30 zu verfolgen.

psuedocode weil das klingt wie Hausaufgaben:

charInLine=0 
iterateOver each char in rawString 
    if(charInLine++ > 30 && currChar==' ') 
     charInLine=0 
     currChar='\n' 
4

Hier ist ein Test-Driven-Lösung.

import junit.framework.TestCase; 

public class InsertLinebreaksTest extends TestCase { 
    public void testEmptyString() throws Exception { 
     assertEquals("", insertLinebreaks("", 5)); 
    } 

    public void testShortString() throws Exception { 
     assertEquals("abc def", insertLinebreaks("abc def", 5)); 
    } 

    public void testLongString() throws Exception { 
     assertEquals("abc\ndef\nghi", insertLinebreaks("abc def ghi", 1)); 
     assertEquals("abc\ndef\nghi", insertLinebreaks("abc def ghi", 2)); 
     assertEquals("abc\ndef\nghi", insertLinebreaks("abc def ghi", 3)); 
     assertEquals("abc def\nghi", insertLinebreaks("abc def ghi", 4)); 
     assertEquals("abc def\nghi", insertLinebreaks("abc def ghi", 5)); 
     assertEquals("abc def\nghi", insertLinebreaks("abc def ghi", 6)); 
     assertEquals("abc def\nghi", insertLinebreaks("abc def ghi", 7)); 
     assertEquals("abc def ghi", insertLinebreaks("abc def ghi", 8)); 
    } 

    public static String insertLinebreaks(String s, int charsPerLine) { 
     char[] chars = s.toCharArray(); 
     int lastLinebreak = 0; 
     boolean wantLinebreak = false; 
     StringBuffer sb = new StringBuffer(); 
     for (int i = 0; i < chars.length; i++) { 
      if (wantLinebreak && chars[i] == ' ') { 
       sb.append('\n'); 
       lastLinebreak = i; 
       wantLinebreak = false; 
      } else { 
       sb.append(chars[i]); 
      } 
      if (i - lastLinebreak + 1 == charsPerLine) 
       wantLinebreak = true; 
     } 
     return sb.toString(); 
    } 
} 
+1

+1, Hinzufügen eines Tests zu Ihrer Antwort ist eine großartige und "Civic" Idee – dfa

+2

Vielen Dank! Ich schreibe gerne zuerst Code-Test und möchte die Praxis fördern; Ich denke, ich werde mehr Antworten auf diese Weise schreiben. Ich schätze die Ermutigung. –

0

Vielleicht vermisse ich etwas.Was ist los mit

String s = ... s = sstring (0, 30) + sstring (30) .replace ('', '\ n');

Dies ersetzt alle Räume mit Zeilenumbrüche nach Zeichen beginnen 30.

Sein etwas weniger effizient, aber für 200 Zeichen es wirklich keine Rolle spielt (das ist extrem klein für die Datenmanipulation).

Bruce

+1

Dann wäre jedes Wort nach dem 30. Zeichen in einer eigenen Zeile. –

Verwandte Themen