无限循环,不会以while循环结束

时间:2011-03-07 20:34:25

标签: java

好吧所以我写了这个程序,它会计算一定的字母和空格,我想让它做的是让用户继续输入短语并继续循环直到用户进入退出终止。我很难看到在哪里放置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=0,countE=0,countS=0,countT=0;


    Scanner scan = new Scanner(System.in);
      // Print a program header
      System.out.println ();
      System.out.println ("Character Counter");
      System.out.println ();

      // Read in a string and find its length
      System.out.print ("Enter a sentence or phrase or enter (Quit) to quit: ");
        phrase = scan.nextLine();
while(!phrase.equalsIgnoreCase ("Quit"))
{
        length = phrase.length();

            // Initialize counts
            countBlank = 0;

        // a for loop to go through the string character by character

            for (int i = 0; i < phrase.length(); i++) 
        {
            if(phrase.charAt(i) == ' ') countBlank++;

            switch(ch=phrase.charAt(i)) 
            {
            case 'a':
            case 'A': countA++;
            break;

            case 'e':
            case 'E': countE++;
            break;

            case 's':
            case 'S': countS++;
            break;

            case 't':
            case 'T': countT++;
            break;

        }
     }


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

  }
 }
}

4 个答案:

答案 0 :(得分:5)

在while循环中,你永远不会阅读下一行。你需要添加

phrase = scan.nextLine();

在'for'循环之后,但仍在'while'循环中。否则,短语将永远是你读到的第一件事。

答案 1 :(得分:1)

复制真的很糟糕,试图避免重复可能是你遇到的问题(不想把scan.nextLine放两次,这是一种非常好的直觉)。我认为菲利普的回答是正确的。

让我以几种不同的方式欺骗​​并重写菲利普的答案

do {
  phrase = scan.nextLine();
  // do stuff
  // ...

} while(!phrase.equalsIgnoreCase ("Quit"));

这样可以消除重复,但是即使短语是“退出”也会导致“填充”“完成”,这也不好 - 并且添加中断会破坏它。

while(true) {
    phrase = scan.nextLine();
    if(!phrase.equalsIgnoreCase ("Quit"))
        break;
     // do stuff
 }

这种方法很完美,但同时(真实)让一些人真的感到不舒服 - 这是一种有些人在年轻时学习并无法克服的宗教信仰,所以你可能不想推翻这个 - 有些如何他们已经确信这比其他解决方案更有可能导致“无限循环”,因为它们在功能上是正确的,但是它还隐藏了可能令人讨厌的循环退出标准。

另一个有效但让一些人感到不舒服的人:

while( (phrase = scan.nextLine()).equalsIgnoreCase ("Quit") ) {
     // do stuff
 }

实际上很少有人在Java中使用它 - 我从来没有使用它,我不完全确定它是有效的,因为我不使用它,但我认为仍然返回要操作的值。无论如何,如果我不得不对它进行测试以确定,那么让其他人花更多的时间来观察它是非常罕见的,这很糟糕。

那么什么是最好的解决方案?可能会将其分解为方法调用:

private string phrase;

boolean readPhrase() {
    phrase=scan.nextLine();
    return !phrase.equalsIgnoreCase("Quit");
}

while(readPhrase()) {
    // do stuff
}

我知道这似乎更多的工作,但是如果你养成将这些东西分解成可用的碎片的习惯,从长远来看你会更快乐。您现在拥有更多模块化,可理解的代码 - 而且实际上没有成本(只要它们是简单,简单,易懂的方法并且您不重复逻辑,就不要将更多方法视为成本)。

老实说,如果你要继续使用它来实现任何真实的东西,我甚至可能创建一个带有.read()方法的“短语”类,该方法包含一个字符串变量和一个.countCharacter(“”)方法。这将使您的代码看起来像这样:

while(phrase.read()) {
    System.out.println("Number of a="+phrase.countCharactr("a")); // assume that countCharacter does a toLower()
    System.out.println("Number of a="+phrase.countCharactr("e"));
    ...
}

突然之间非常易读且紧凑。

另请注意,当您减少此类代码时,其他模式很容易识别。在这种情况下,您甚至可能会注意到您可以将上面重复的行分解出来,因为它们在每种情况下只会因一个字符而异:

char[] chars="aest".toCharArray();

while(phrase.read()) 
    for(char c : chars)
        System.out.println("Number of "+c+"="+phrase.countCharactr(c)); // assume that countCharacter does a toLower()
// this is untested and some of the conversions/methods/etc may need tweaking.    

你的整个“主要”简化为几行和一个简单的中学课程。那不是更好吗?

对于过度分析感到抱歉。失业并开始真正错过编码。

答案 2 :(得分:0)

您应该在while循环结束时扫描一个新行。现在构建循环的方式,你继续使用相同的输入进行迭代。

phrase = scan.nextLine();
while(!phrase.equalsIgnoreCase ("Quit")){
  // do stuff
  // ...
  phrase = scan.nextLine();
}

答案 3 :(得分:0)

// Read in a string and find its length
System.out.print ("Enter a sentence or phrase or enter (Quit) to quit: ");

while (true) {
    phrase = scan.nextLine();
    if (phrase.equalsIgnoreCase("Quit")) break;

    // Initialize your counter variables here

    length = phrase.length();
    // and so on...
}