计算字符

时间:2013-02-28 21:07:33

标签: java while-loop character switch-statement counting

我在编写代码时遇到问题,只要用户没有结束“退出”,就会生成一个while循环请求用户输入。当我运行代码时,它只生成第一个提示问题“输入一个句子或一个短语:”,然后在输入短语后它不会计算while语句。有谁知道我做错了什么?

问题是: “让程序让用户继续输入短语而不是每次都重新启动它会很好。为此,我们需要围绕当前代码的另一个循环。也就是说,当前循环将嵌套在新循环中。添加一个外部while循环,只要用户没有输入短语quit就会继续执行。修改提示以告诉用户输入短语或退出退出。请注意,计数的所有初始化都应在内部while循环(也就是我们希望用户输入的每个新短语重新开始计数)。你需要做的就是添加while语句(并考虑读取的位置,以便循环正常工作)。确保要通过程序并在添加代码后正确缩进 - 使用嵌套循环,内部循环应该缩进。“

    import java.util.Scanner;
    public class Count

    {
         public static void main (String[] args)
         {

              String phrase;    // A string of characters
              int countBlank;   // the number of blanks (spaces) in the phrase 
              int length;       // the length of the phrase
              char ch;      // an individual character in the string      

    int countA, countE, countS, countT; // variables for counting the number of each letter

    scan = new Scanner(System.in);

    // Print a program header
    System.out.println ();
    System.out.println ("Character Counter");
    System.out.println ("(to quit the program, enter 'quit' when prompted for a phrase)");
    System.out.println ();

    // Creates a while loop to continue to run the program until the user
    // terminates it by entering 'quit' into the string prompt.

        System.out.print ("Enter a sentence or phrase: ");
        phrase = scan.nextLine();

        while (phrase != "quit");
        {   
            length = phrase.length();



                // Initialize counts
                countBlank = 0;
                countA = 0;
                countE = 0;
                countS = 0;
                countT = 0;

                // a for loop to go through the string character by character
                // and count the blank spaces

                for (int i = 0; i < length ; i++)
                {
                    ch = phrase.charAt(i);

                    switch (ch)
                    {
                        case 'a':             // Puts 'a' in for variable ch
                        case 'A':  countA++;  // Puts 'A' in for variable ch and increments countA by 1 each time
                                    break;    // one of the variables exists in the phrase

                        case 'e':             // puts 'e' in for variable ch
                        case 'E':  countE++;  // ... etc.
                                    break;
                        case 's':
                        case 'S':  countS++;
                                    break;
                        case 't':
                        case 'T':  countT++;
                                    break;

                        case ' ':  countBlank++;
                                    break;
                    }

                }

            // Print the results
            System.out.println ();
            System.out.println ("Number of blank spaces: " + countBlank);
            System.out.println ();
            System.out.println ("Number of a's: " + countA);
            System.out.println ("Number of e's: " + countE);
            System.out.println ("Number of s's: " + countS);
            System.out.println ("Number of t's: " + countT);
            System.out.println ();



    }   
}

}

3 个答案:

答案 0 :(得分:5)

这是两个方面的问题:

while (phrase != "quit");

首先,不要使用==!=进行字符串相等性检查。它仅检查引用标识

其次,最后的;意味着它将永远循环。它相当于:

while (phrase != "quit")
{
}

你想:

while (!phrase.equals("quit"))

想要在循环结束时要求更多输入。 (仍然在循环体内,但在输出部分之后。)或者将循环条件更改为永久循环,在开始时请求输入,然后在输入为&#34;退出&#34;时断开。

答案 1 :(得分:1)

您需要在while循环内再次收集输入。最后放一些这样的东西:

phrase = scan.nextLine();

请注意,在while循环开始之前,您只获得一次phrase的值。在那之后,你永远不会把它设置为其他任何东西。执行输出后,您需要为phrase收集另一个值(可能等于“退出”)。

编辑:还有,Jon说的话。听他的。他......非常聪明。

答案 2 :(得分:0)

地图在这里是更好的选择:

Map<Character, Integer> counter = new HashMap<Character, Integer>();
for(int i = 0; i < length ; i++)
{
    ch = phrase.charAt(i);
    counter.put(ch, counter.get(ch) + 1);
int charACount = counter.get('A');