【问题标题】:How many times there is a substring in a string [Java]字符串中有多少次子字符串[Java]
【发布时间】:2016-06-01 04:18:59
【问题描述】:

我正在尝试编写代码以确定字符串 s2 中存在字符串 s1 的次数。

这是我写的代码,但不起作用:

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);

    }
}

谁能检查我的代码并告诉我我的错误是什么?

【问题讨论】:

  • 抱歉 ok=1 和 i=1;我已将它们从代码中删除。
  • 代码审查与 SO 无关。供审查,有Code Review。如果您的代码不起作用,请描述您的输入、预期输出和观察到的输出。
  • @Turing85 不推荐 CR,这是题外话。
  • 为什么不起作用?代码是否打印 4 而您期望 1?
  • 不工作如何

标签: java string search substring


【解决方案1】:

问题是您在 for 循环中使用了错误的结束条件。您尝试访问的s2 中的最高索引是i + s1.length(),因此您需要确保它始终最多为s2.length() - 1

将您的 for 循环更改为:

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

它会起作用的。

【讨论】:

  • 我当时不能:)。
【解决方案2】:

这是一个有点不同的方法,但它也应该有效。您只需拆分字符串并检查它的大小 -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));

【讨论】:

    【解决方案3】:

    我会计算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)要高效得多,因为它不构造任何额外的对象。

    【讨论】:

    • 如果我输出 numCcurrrences 我得到 0,对于问题中的字符串。
    • ...这就是为什么你给变量起比s1s2更好的名字。固定。
    • 呸。在 while 循环中间的 break 语句为以后的严重错误留出了空间......
    猜你喜欢
    • 2017-03-16
    • 2010-11-13
    • 2015-03-20
    • 1970-01-01
    • 2023-03-30
    • 2015-03-15
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    相关资源
    最近更新 更多