2016-02-19 114 views
-2

我正在嘗試編寫一段代碼以確定字符串s2中有多少次s1字符串。在一個字符串中有多少次子字符串[Java]

這是代碼我已經寫了,但不工作:

package lab2_1; 

public class Main { 

    public static void main(String[] args) { 
     String s1 = "si"; 
     String s2 = "sir1 si cu sir2 fac un sir3"; 

     int count = 0; 
     int ok=1; 
     int i=1; 
     for(i=0;i<=s2.length()-1;i++) 
      if (s2.substring(i,i+s1.length()).equals(s1)) 
       count++; 


     System.out.println(count); 

    } 
} 

你能不能請人檢查我的代碼,並告訴我什麼是我的錯?

+0

對不起關於ok = 1和i = 1;我已經從代碼中刪除了它們。 –

+1

代碼審查與SO無關。對於審查,有[代碼審查](http://codereview.stackexchange.com/)。如果你的代碼不起作用,請描述你的輸入,你的期望輸出和你觀察到的輸出。 – Turing85

+2

@ Turing85不推薦CR,這是無關緊要的話題。 – Tunaki

回答

3

問題是您在for循環中使用了錯誤的結束條件。您嘗試訪問的s2中的最高索引是i + s1.length(),因此您需要確保始終爲最多s2.length() - 1

for循環改成這樣:

for(i = 0; i + s1.length() < s2.length(); i++) 

,它會工作。

+0

謝謝。它現在有效。 –

+0

@LaurenţiuRoşu然後你應該接受他的回答。 – Jure

+0

我當時沒有能力:)。 –

1

這是一個有點不同的方法,但它也應該工作。你只拆分字符串,並檢查它的大小-1:

String s1 = "si"; 
String s2 = "sir1 si cu sir2 fac un sir3"; 
String[] split = s2.split(s1); 
System.out.println("number of substrings: " + (split.length - 1)); 
1

我會算多少次String.indexOf返回一個非負數:

int lastPos = -1; 
int count = 0; 
while (true) { 
    lastPos = s2.indexOf(s1, lastPos + 1); 
    if (lastPos < 0) break; 
    ++count; 
} 

這比使用String.split更有效(或String.substring),因爲它不構建任何其他對象。

+0

如果我輸出numCcurrrences我得到0,問題中的字符串。 – Jure

+0

...這就是爲什麼你給變量比's1'和's2'更好的原因。固定。 –

+0

Yuck。在一段時間內中斷報表,留下後來嚴重錯誤的空間...... – Floam

相關問題