如何查找字符串中使用子字符串的次数?

时间:2016-03-24 07:13:59

标签: java

public Object countOccurrences(String string)
{
    int e = 0;
    int i = 0;
    while ( i < sentence.length())
    {
        if(sentence.contains(string))
        {
            e++;
            i++;
            return e;
        }
        else
        {
            break;
        }
    }
    return e;
}

我的代码有什么问题不允许我通过测试?无论如何我可以在循环中使用substring方法来做到这一点吗?

@Test
public void testCountOccurrences()
{
    assertEquals(1, sc1.countOccurrences("ence"));
    assertEquals(2, sc1.countOccurrences("en"));
    assertEquals(1, sc2.countOccurrences("that"));
    assertEquals(0, sc2.countOccurrences("This"));

}

2 个答案:

答案 0 :(得分:7)

  

我的代码出了什么问题,不允许我通过测试?

在做任何其他事情之前,您应该考虑如何解决代码开始时出现的问题。你通过它调试了吗?它在什么时候表现得与你的预期不同?如果您尚未学习如何使用调试器,那么现在是开始的好时机。

关于下一步,请查看以下代码:

if(sentence.contains(string))
{
    e++;
    i++;
    return e;
}

该条件不依赖于ie,只取决于sentencestring。因此,只要sentence的长度至少为1,您就会返回1或0.您的代码永远不会返回 more 而不是1。

目前你的代码出了什么问题 - 关于如何修复它,我开始关注String.indexOf(String, int)。换句话说,您想要找到第一个匹配项,然后找到 next 出现,然后找到 next 出现,直到找不到为止。 (使用返回值来确定从哪里开始查看下一次迭代,以及检查是否存在匹配。)

有几种情况需要注意:

  • “abbbc”包含“bb”多少次?
  • “abbbc”包含多少次“”?

我还会提出其他一些改变:

  • 您的方法的返回类型为Object - 为什么?当然它总是会返回一个整数,所以返回类型int会更合适
  • 这是参数化测试的理想选择。了解如何有效地将单个测试分成多个可以独立通过或失败的测试用例,但没有大量测试方法的源代码开销...(提示:每个测试用例应该有句子,文本是你的寻找,以及预期的比赛数量。)

答案 1 :(得分:0)

public Object countOccurrences(String string) {
    int e = 0;
    int i = 0;
    while (i <= (sentence.length() - string.length() + 1)) {
        if (sentence.substr(i, string.length() - 1).equals(string)) {
            e++;
        }


        i++;
    }
    return e;
}

我自己没有尝试,但它应该有用。