【问题标题】:Displaying the number of white spaces in an inputted string?显示输入字符串中的空格数?
【发布时间】:2016-10-02 08:07:59
【问题描述】:

我正在尝试编写一个快速程序来计算输入字符串中空格的数量。这是我目前所拥有的:

import java.util.Scanner;

public class BlankCharacters
{
    public static void main(String[] args) 
    {   
        System.out.println("Hello, type a sentence. I will then count the number of times you use the SPACE bar.");

        String s;
        int i = 0;
        int SpaceCount = 0;

        Scanner keyboard = new Scanner(System.in);
        s = keyboard.nextLine();

        while (i != -1)
        {
            i = s.indexOf(" ");
            s = s.replace(" ", "Z");
            SpaceCount++;
        }

        System.out.println("There are " + SpaceCount + " spaces in your sentence.");     
    }
}

while 循环首先使用 s.indexOf(" ") 查找字符串 s 中的第一个空格,将其替换为 char Z,然后将值 SpaceCount 加 1。重复这个过程,直到 s.indexOf 没有找到空白,导致 i 为 -1 并因此停止循环。

换句话说,SpaceCount 每次找到空白时都会增加 1,然后向用户显示空白的总数。或者应该是……

问题:SpaceCount 没有增加,而是总是打印出 2。

如果我输入“一二三四五”并打印出 String s,我会得到“oneZtwoZthreeZfourZfive”,表示有四个空格(并且 while 循环运行了四次)。尽管如此,SpaceCount 仍为 2。

程序运行良好,但始终显示 SpaceCount 为 2,即使字符串/句子超过十或二十个单词。即使使用 do while/for 循环,我也会得到相同的结果。我已经被困了一段时间,我不确定为什么当 while 循环的其余部分继续执行(如预期的那样)时 SpaceCount 卡在 2。

非常感谢任何帮助!

【问题讨论】:

  • 如果你的字符串没有尾随空格我的意思是在字符串之前和之后,那么你也可以使用StringTokenizer tokenizer = new StringTokenizer(str, " "); System.out.println("total number of spaces are : " + (tokenizer.countTokens() - 1)); 如果你在计算空格之前修剪字符串
  • 我会尝试其他人提到的方法。我真的很好奇为什么 SpaceCount 不会改变。谢谢。

标签: java


【解决方案1】:

我真的很好奇为什么 SpaceCount 不会改变

在循环的第一次迭代中,将" " 替换为空(所有空格),并递增SpaceCount。在第二次迭代中,您什么也找不到(得到-1),什么都没有替换,然后递增SpaceCount(得到2)。

我不会修改String,而是迭代String 中的字符并计算空格。

System.out.println("Hello, type a sentence. I will then count the "
    + "number of times you use the SPACE bar.");
Scanner keyboard = new Scanner(System.in);
String s = keyboard.nextLine();
int spaceCount = 0;
for (char ch : s.toCharArray()) {
    if (ch == ' ') {
        spaceCount++;
    }
}
System.out.println("There are " + spaceCount + " spaces in your sentence.");

此外,按照惯例,变量名称应以小写字母开头。而且,您可以通过在声明变量时初始化变量来使代码更简洁。

【讨论】:

    【解决方案2】:

    您在计算空白方面已经走了很长一段路。替换这段代码:

        while (i != -1)
        {
            i = s.indexOf(" ");
            s = s.replace(" ", "Z");
            SpaceCount++;
        }
    

    有了这个:

    char[] chars = s.toCharArray();
    for(char c : chars){
        if(c == ' '){
            spaceCount++;
        }
    }
    

    这更优雅一些,而且(我相信)执行起来也更便宜。希望对你有用!

    【讨论】:

    • @Gray 这是一个巧合。我不知道在这种情况下该怎么办...我应该删除答案还是什么?
    • 不。没关系。有时我觉得人们只是复制别人的答案。如果你愿意,你可以把它充实一点,并添加更多细节。
    • if(char == ' '){ 应该是if(c == ' '){char 是一个数据类型。
    【解决方案3】:

    使用这个,简单直接。用 none 替换空格字符,然后用字符串的实际长度减去它。那应该给出字符串中的空格数

    Scanner n = new Scanner(System.in);
    n.useDelimiter("\\n");
    String s = n.next();
    int spaceCount = s.length() - s.replaceAll(" ", "").length();
    System.out.println(spaceCount);
    

    【讨论】:

    • 不知道 s.replaceAll 是什么东西,谢谢!对 Java 来说还是很陌生。
    • 是的@RyanA。运行它并检查它。工作正常。
    • 这是一种相当昂贵的方法。它使用正则表达式和StringBuffer,这是一个同步类。
    • @Gray。这是试图给出一个答案。很明显,您可以遍历每个字符并将其等同于空间并增加计数,从而降低复杂性。这是尝试用更少的代码行来完成相同的工作。
    • 没关系@sameerasy。我只是想指出后代的费用。很多人不知道 replaceAll 这么重。
    猜你喜欢
    • 2020-11-20
    • 1970-01-01
    • 2023-01-29
    • 2015-07-06
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 2017-09-06
    相关资源
    最近更新 更多