2010-12-14 58 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