2016-02-19 106 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

相关问题