检查字符串内容会返回意外结果

时间:2014-10-27 13:08:49

标签: java

我必须编写一个名为ghostHunters()的方法,该方法接受 String 作为参数。该方法应确定 String 是否包含单词 boo 。如果 String 包含 boo 但有两个以上 o ,则该方法应返回false

到目前为止,我已经设法开发了一些在某些情况下可以正常工作的代码。但是,如果我输入像Bob says boo这样的 String ,它就不起作用。

有什么建议吗?

public static boolean ghostHunters(String word)
{
    word = word.toLowerCase()+ " ";
    if(word.contains("boo") && word.length() > 3)
    {
        word = word.substring(word.indexOf("b"),word.indexOf("b")+4);
        for(int i = 0; i < word.length()- 2; i++)
        {
            if(word.charAt(i) == 'b' && word.charAt(i+1) == 'o'&& word.charAt(i+2) == 'o' && word.charAt(i+3) != 'o')
            {
                return true;  
            }
        }
        word = word.substring(word.indexOf("b"),word.indexOf("b")+4);
    }
    else if(word.contains("boo"))
        return true;
    return false;

}

8 个答案:

答案 0 :(得分:0)

如果“boo”位于单词的末尾,word.substring(word.indexOf("b"),word.indexOf("b")+4)将为您提供StringIndexOutOfBoundsException,因为word.indexOf("b")+2是字符串的最后一个索引,substring尝试返回索引为word.indexOf("b")word.indexOf("b")+3的字符。

您必须检查word.indexOf("b")+4 <= word.length()

答案 1 :(得分:0)

如果您输入 Bob说boo ,则返回false,因为 Bob 还有 o ,这与两个o一起计算在 boo 这个词中。因此,o的总数变为3,大于2.因此返回false。

答案 2 :(得分:0)

可能效率更高,但它确实有效,因此您可以找出缺少方法的原因。

public static boolean ghostHunters(String s)
{
    String str = s.toLowerCase();
    int oCount = 0;

    if(s.contains("boo"))
    {
        for (int i = 0; i < s.length(); i++)
        {
            if(s.charAt(i) == 'o' && ++oCount == 3) return false;
        }           
        return true;
    }
    else
        return false;
}

答案 3 :(得分:0)

public static boolean ghostHunters(String word) {
    if (word == null)
        return false;
    word = word.toLowerCase();
    if (word.length() < 3)
        return false;
    if (!word.contains("boo"))
        return false;
    else if (word.length() == 3) 
        return true;

    int index = word.indexOf("boo");
    if (word.charAt(index+1) != 'o')
        return true;

    return false;
}

答案 4 :(得分:0)

你可以试试这个解决方案:

public static boolean ghostHunters(String word) {

    word = word.toLowerCase() + "";
    if (word.contains("boo") && word.length() > 3) {
        if (word.contains("booo"))
        return false;
        else
        return true;
    } else
        return false;
}

它检查字符串在o之后是否包含两个以上b,这正是您所需要的。

答案 5 :(得分:0)

你可以使用正则表达式,我认为它更具可读性

public static boolean ghostHunters(String word) {
    return word.toLowerCase().matches(".*?boo[^o]*");
}

答案 6 :(得分:0)

public static boolean ghostHunters(String word)
{
    word = word.toLowerCase() + " ";
    if(word.contains("boo") && word.length() > 3){
        if (word.charAt(word.indexOf("boo")+3) == 'o'){
            return false;
        } else{
            return true;
        }
    }else if(word.contains("boo")){
        return true;
    }
    return false;
}

我对您的代码进行了一些小的更改,它现在似乎正常工作。 我检查了&#34; boo&#34;的索引。 + 3这将是跟随&#34; boo&#34;。超过2个结果是假的,只是&#34; boo&#34;结果是真的。

答案 7 :(得分:0)

使用@camabeh建议的正则表达式。什么是“可读”可能取决于您当前的技能组合,我记得我之前发现regexps 非常高效非常难以理解

更简单的解决方案是将输入分成单词,然后只需检查循环中的单词:

public static boolean ghostHunters(String sentence) {
    if (sentence == null)
        return false;
    }
    String[] words=sentence.toLowercase().split(" "); // split on word boundaries
    for (String word:words) {
        if (word.equals("boo")) {
            return true; 
        }  
    }
    // no match
    return false;
}

这确保“Bob有胸部”将返回false,但“Bob说boo”是真的,而“Bob错过并说booo”是假的。 (如果你需要接受现实生活中的句子,你可能希望将分割调整为在标签,新行等上分割。)

我建议您说出您的计划,以便揭示您的意图。上面这个例子清楚地表明我们将句子分成单词,然后我们比较单词。

您的原始示例显示了很多内部字符串操作,因此很难理解。我会说它太低了。

来自@camabeh的regexp示例非常简洁,一旦你熟练使用regexp就可以很好地为你服务。对于初学者级别的CS问题,这是一个(可能)过高的解决方案。