0

需要为一个名为 wordCount() 的方法编写一个方法签名,该方法接受一个字符串参数,并返回该字符串中的单词数。就本问题而言,“单词”是任何字符序列;它不必是一个真正的英语单词。单词用空格分隔。例如: wordCount(“Java”) 应该返回值 1。

我写了一个代码,但问题在于抛出异常。我有一个错误说:“在java中包含的字符串不能以空格结尾”和“在java中包含的字符串不能以空格开头”我的尝试:

int wordCount(String s){
       if (s==null) throw new NullPointerException ("string must not be null");
      int counter=0;
        for(int i=0; i<=s.length()-1; i++){    
          if(Character.isLetter(s.charAt(i))){
             counter++;
             for(;i<=s.length()-1;i++){
                     if(s.charAt(i)==' '){
                             counter++;
                     }
             }
          }
     }
     return counter;
    } 
4

4 回答 4

1

您在异常处理方面处于正确的轨道上,但并不完全正确(正如您所注意到的)。

试试下面的代码:

public int wordCount(final String sentence) {
    // If sentence is null, throw IllegalArgumentException.
    if(sentence == null) {
        throw new IllegalArgumentException("Sentence cannot be null.");
    }
    // If sentence is empty, throw IllegalArgumentException.
    if(sentence.equals("")) {
        throw new IllegalArgumentException("Sentence cannot be empty.");
    }
    // If sentence ends with a space, throw IllegalArgumentException. "$" matches the end of a String in regex.
    if(sentence.matches(".* $")) {
        throw new IllegalArgumentException("Sentence cannot end with a space.");
    }
    // If sentence starts with a space, throw IllegalArgumentException. "^" matches the start of a String in regex.
    if(sentence.matches("^ .*")) {
        throw new IllegalArgumentException("Sentence cannot start with a space.");
    }

    int wordCount = 0;

    // Do wordcount operation...

    return wordCount;
}

正则表达式(或“正则表达式”对于知道的酷孩子来说)是字符串验证和搜索的绝佳工具。上面的方法实现了快速失败的实现,即该方法在执行昂贵的处理任务之前会失败,而这些任务无论如何都会失败。

我建议复习一下这里介绍的两种做法,即机器人正则表达式和异常处理。下面包括一些可帮助您入门的优秀资源:

于 2013-11-01T02:55:14.387 回答
0

我会使用这种String.split()方法。这需要一个正则表达式,它返回一个包含子字符串的字符串数组。从那里获取并返回数组的长度很容易。

这听起来像是作业,所以我将把具体的正则表达式留给你:但它应该很短,甚至可能只有一个字符长。

于 2013-11-01T01:02:18.227 回答
0

我会使用google guava library 中的分离器。它会更正确,因为即使在这种简单的情况下,标准 String.split() 也无法正常工作:

// there is only two words, but between 'a' and 'b' are two spaces
System.out.println("a  b".split(" ").length);// print '3' becouse but it think than there is 
// empty line between these two spaces

使用番石榴,您可以这样做:

Iterables.size(Splitter.on(" ").trimResults().omitEmptyStrings().split("same  two_spaces"));// 2
于 2013-11-01T01:20:40.017 回答
0

我会String.split()用来处理这种情况。它会比粘贴的代码更有效率。确保检查空字符。这将有助于具有多个空格的句子(例如“This_sentences_has__two_spaces”)。

 public int wordCount(final String sentence) {
    int wordCount = 0;
    String trimmedSentence = sentence.trim();
    String[] words = trimmedSentence.split(" ");
    for (int i = 0; i < words.length; i++) {
        if (words[i] != null && !words[i].equals("")) {
            wordCount++;
        }
    }
    return wordCount;
}
于 2013-11-01T01:21:56.330 回答