2009-06-23 66 views
3

我有一大段文本(字符串中有200多個字符),需要在30個字符後的下一個空格處插入新行以保留單詞。以下是我現在有(不工作):JAVA-在30個字符後面的下一個空格處插入新行

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()); 
} 

感謝所有幫助

+0

那麼問題是什麼?這是否工作? – 2009-06-23 16:08:45

+0

對不起,它不工作,我會編輯問題 – 2009-06-23 16:09:47

+3

順便說一下,正確的大小寫是「Java」,而不是「JAVA」 - 但標籤通常足以讓人們知道您感興趣的平臺。 – erickson 2009-06-23 16:10:51

回答

16

如建議通過kdgregory,使用StringBuilder很可能是一個更簡單的方法以字符串處理工作。

因爲我不太確定插入換行符前的字符數是30個字符之前還是之後的單詞,所以我選擇了30個字符後面的單詞,因爲實現可能更容易。

該方法是找到" "的實例,該實例在使用StringBuilder.indexOf查看當前字符後至少出現30個字符。當發生空間時,\nStringBuilder.insert插入。

(我們假設換行符是\n這裏 - 當前環境中使用的實際行分隔符可以通過System.getProperty("line.separator");來檢索)。

這裏的例子:

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()); 

結果:

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

我要補充一點,上面的代碼沒有經過測試的,除了我在所給出的示例String碼。如果它在某些情況下不起作用,那就不足爲奇了。

編輯

在示例代碼中的環已被替換爲while循環而不是一個循環for這是不在這個例子中很合適的。

此外,StringBuilder.insert方法是由StringBuilder.replace方法取代,因爲凱文·施蒂希在評論中提到replace方法使用,而不是insert以獲得所需的行爲。

2

更好的解決方案:將字符串複製到一個StringBuilder,讓您可以插入/變更字符沒有很多子的碴。然後使用indexOf()方法找到要更改的索引。

編輯:德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

我認爲,如果你不在while循環中增加pos,你會不小心用\ n替換每個空格,導致第一個單詞之後的所有行都有一個單詞。每次換人後你需要將位置提升30。 – Karl 2009-06-23 16:19:38

+0

仔細看看while表達式 - 它更新pos – kdgregory 2009-06-23 16:30:07

1

我會遍歷字符串而不是30.你必須跟蹤30。

僞代碼,因爲這聽起來像功課:

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

這是一個測試驅動的解決方案。

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(); 
    } 
} 
0

也許我錯過了一些東西。

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

該命令替換所有的換行字符空格之後開始30

其略效率較低,但對於200個字符它其實並不重要(這是非常小的數據操作)。

Bruce

相關問題