2010-12-14 10 views
0

これはなぜinfinteループですか?あなたはbody文字列を変更しないので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

私が選んだ答えはより良い解決策だと思います。 previousIndexを1増やしますが、探しているパターンは6文字の長さですので、6が良いです。したがって、ソリューションアドバイスのように次の5文字を​​確認する必要はありません。これが意味ですか? – Vincent

+0

実際にはありません。 1つをインクリメントすることで、検索しているパターンが文字列の先頭に見つかりません。したがって、問題は解決されます。簡単に言えば、検索は「br />」から始まり、「
」を探しているので、次の出現「
」まで見つけることはできません。選択したソリューションは、各反復でパターンのサイズを不必要に計算します。 – aligf

+0

はい、再び出現を見つけることはできませんが、それでも "br />"をチェックします。ちょうど6を追加すると、それは見えなくなり、見栄えが始まります。しかし、実際に私はあなたの答えの両方を選んだ。あなたのようにBRのサイズを計算して速くnrを追加するだけなので、1の代わりに6を追加すると少し速くなります。 – Vincent

答えて

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

は、そうindexOf常にストリングがbodyに含まれているため-1という別のインデックスを返します。

ループの最後にbody = body.substring(index);を追加して修正します。

3

変更し、最後の行に:

previousIndex = index + 1; 
1

これは、問題を修正する必要があります

previousIndex=index + 1; 

そうでない場合は、必ずパターンの最初のoccuranceを見つけることができます。

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

これは最善の解決策ですが、j2meは限定されたlibrairyで動作します(文字列にはsplitメソッドがありません) – Vincent

関連する問題