对于空文件,字数返回1

时间:2017-03-13 22:35:54

标签: java count word

此代码用于计算输入中的单词。它的工作原理除非输入中没有单词 - 它返回1而不是0.这里有什么问题?

import java.util.Scanner;

public class Exercise12 {
    public static void main(String[] args) {
         Scanner kb = new Scanner(System.in);
         System.out.println("Input, Stop by #");
         String input = kb.nextLine();
         while (! input.equals("#")) {
             wordCount(input);
             input = kb.nextLine();             
            }
    } //main

    public static void wordCount(String countSpace) {
        int count = 1;
        for (int i =0; i < countSpace.length(); i++ ) {
            if ((countSpace.charAt(i)) == ' ') {
                count++;
            }
        }
        System.out.println(count);      
    }
} // class Exercise12

4 个答案:

答案 0 :(得分:3)

你可以像这样使用split函数:

public static void wordCount(String countSpace) {

    String[] words = countSpace.split(" ");
    int count = words.length;

    System.out.println(count);  

}

修改

正如@Jérôme在下面建议的那样,我添加了trim函数并检查空输入,现在它可以正常工作。我也将split函数中的字符串更改为“\ s +”正则表达式,正如@Aleks G建议的那样。请你纠正。请参阅下面的更新代码:

public static void wordCount(String countSpace) {

    String[] words = countSpace.trim().split("\\s+");

    int count = 0;
    if (!(words[0].equals(""))){
        count = words.length;
    }        

    System.out.println(count); 
}

答案 1 :(得分:3)

为了使一切正常,您应trim() String删除前导和尾随空格。然后split空格中的String并计算所有非空String。空String是由连续的空格引起的。

使用Java 8:

public static void wordCount(String countSpace) {
    System.out.println(Arrays.stream(countSpace.trim().split(" ")).filter(word->!word.isEmpty()).count());
}

答案 2 :(得分:1)

TL; DR:使用StringTokenizer

public static void wordCount(String input) {
    int count = new java.util.StringTokenizer(input).countTokens();
    System.out.println(count);      
}

长解释:

您的代码几乎是正确的,但是您将计数初始化为1.然后针对找到的每个空格字符递增它。在输入结束时你没有空格,因此你不会增加最后一个单词的计数 - 这会补偿你从1开始而不是0.但是,如果是空输入,你从1开始,那里是没有什么可读的 - 因此你的结果是错误的。

第一个修复很简单:将初始化更改为int count = 0

public static void wordCount(String countSpace) {
    int count = 0;
    for (int i =0; i < countSpace.length(); i++ ) {
        if ((countSpace.charAt(i)) == ' ') {
            count++;
        }
    }
    System.out.println(count);      
}

下一个问题是你不是在计算单词,而是单词分隔符。如果两个单词之间有两个连续的空格怎么办?此外,如果您遇到行尾或文件结尾会发生什么?你的代码将破坏那些。

理想情况下,您应该使用标记生成器来计算单词,但至少应该计算从空格/行结尾切换到字母数字字符的次数。以下是使用Tokenizer的示例:

public static void wordCount(String input) {
    int count = new java.util.StringTokenizer(input).countTokens();
    System.out.println(count);      
}

答案 3 :(得分:0)

您需要单独处理空输入的情况。此外,您应该记住,输入可能在行的开头/结尾包含两个连续的空格或空格,不应该对单词进行计数。

对于这些特殊情况,代码如下所示:

public static void wordCount(String in){
    boolean isspace = true;
    int count = 0;
    for(int i = 0; i < in.length(); i++)
    {
        //increment count on start of a word
        if(isspace && in.charAt(i) != ' ')
        {
            count++;
            isspace = false;
        }
        //reset isspace flag on end of a word
        else if(!isspace && in.charAt(i) == ' ')
            isspace = true;
    }

    System.out.println(count);
}

此代码确保仅在实际遇到单词时对单词进行计数,并忽略重复的空格。