2010-12-14 56 views
0

有人可以告訴我爲什麼這是一個無限循環?使用indexof尋找字符串模式

private void splitBody() { 
     bodyparts=new Vector(); 
     String body = "<br />testtestest<br />fefefefefefefefefef<br />qqqqqqqqqqqq"; 

     int previousIndex=0; 
     while(body.indexOf("<br />",previousIndex)!=-1) { 
      int index=body.indexOf("<br />",previousIndex); 
      System.out.println(body.substring(previousIndex, index)); 
      bodyparts.addElement(body.substring(previousIndex, index)); 
      previousIndex=index; 
     } 
    } 
+0

因爲我認爲我選擇的答案是一個更好的解決方案。你用1增加previousIndex,而6更好,因爲我要找的模式長6個字符。所以你不需要檢查你的解決方案建議的接下來的5個字符。這是否使感覺? – Vincent 2010-12-14 15:10:31

+0

不是。通過增加一個,你正在搜索的模式不會在字符串的開頭找到,因此你的問題將被解決。簡而言之,搜索將從「br />」開始,並且您正在查找「
」,因此直到下一次出現「
」時纔會找到它。您選擇的解決方案不必要地計算每次迭代時圖案的大小。 – aligf 2010-12-14 15:15:00

+0

是的,它不會再次找到發生,但它仍然會檢查「br />」,而當我只加6時,它不會,並開始照看。但實際上我選擇了你的兩個答案;你的,因爲只是增加nr​​ s然後計算br的大小就像你說的那樣,因爲加6而不是1會快一點。 – Vincent 2010-12-14 15:20:12

回答

1

的操作的indexOf返回起始位置。如果你想前進,像這樣增加previousIndex。

bodyparts=new Vector(); 
    String body = "<br />testtestest<br />fefefefefefefefefef<br />qqqqqqqqqqqq"; 

    int previousIndex=0; 
    while(body.indexOf("<br />",previousIndex)!=-1) { 
    int index=body.indexOf("<br />",previousIndex); 
    System.out.println(body.substring(previousIndex, index)); 
    bodyparts.addElement(body.substring(previousIndex, index)); 
    previousIndex=index+("<br />".size()); 
    } 
1

因爲你不改變你的body字符串,所以indexOf始終返回-1由於子被包含在body不同的指標。

在循環結尾添加body = body.substring(index);以解決該問題。

3

更改最後一行:

previousIndex = index + 1; 
1

這應該可以解決這個問題:

previousIndex=index + 1; 

否則你一定會找到的模式中第一次出現。

或者 - 簡化了整個事情:

String[] parts = body.split("<br />"); 
+0

這將是最好的解決方案,但j2me適用於有限的圖書館(字符串不具有拆分方法) – Vincent 2010-12-14 14:42:59