此代码用于计算输入中的单词。它的工作原理除非输入中没有单词 - 它返回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
答案 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);
}
此代码确保仅在实际遇到单词时对单词进行计数,并忽略重复的空格。