Java 忽略循环参数;循环不中断

Java Loop parameters are ignored; Loop doesn't break

我希望我的输入最少为 4 个字符串,最多为 8 个。我正在对它们进行标记以供练习。我设置了参数,使令牌的数量必须大于 4 且小于 8,但是我的代码 运行s 无论令牌的数量如何,我也不知道为什么。

我也试过在多个位置插入一个中断,但我不知道如何停止并继续。每次 运行 我都需要手动终止它。

我想获取输入,重新打印它,列出每个标记中的字符数,然后针对 upper/lower 大小写、数字、空格再次重新评估字符。

非常感谢任何见解。

这是我的代码:

import java.util.ArrayList;
import java.util.Scanner;
import java.util.StringTokenizer;

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

    Scanner sc = new Scanner(System.in);

    ArrayList<String> tokenizedInput = new ArrayList<>();
    String sentenceRetrieved;

    // getting the sentence from the user
    System.out.println("Please type a sentence containing at least 4 words, with a maximum of 8 words: ");
    sentenceRetrieved = sc.nextLine();
    StringTokenizer strTokenizer = new StringTokenizer(sentenceRetrieved);

    
    while (true) {
        while (strTokenizer.hasMoreTokens()) {
            tokenizedInput.add(strTokenizer.nextToken());
        int count = strTokenizer.countTokens();
        if (count <= 8 && count >= 4) {
            break;
        }
    }
        

    // printing out the sentence
    System.out.println("You entered: ");
    System.out.println(sentenceRetrieved);


    // count the characters in each word
     int totalLength = 0;

      for (String each : tokenizedInput) {

         totalLength += each.length();
         System.out.println( each + " has " + each.length() + " characters.");
      }
      
         System.out.println("The total number of characters entered without spaces: "+
                    sentenceRetrieved.replace(" ", "").length());
         
         /*
          * Setting up a character array and determining how many
          * letters, digits, lower case letters, upper case letters and white spaces in the input.
          */
         
         char [] array;
         int letters = 0,
             digits = 0,
             lowerCase = 0,
             upperCase = 0,             
             whitespaces = 0;
         
         array = sentenceRetrieved.toCharArray();
         for(int i = 0; i< array.length; i++) {
            if (Character.isLetter(array[i]))
                 letters ++;
            if(Character.isDigit(array[i]))
                digits++;
            else if(Character.isUpperCase(array[i]))
                upperCase++;
            else if(Character.isLowerCase(array[i]))
                lowerCase++;
            else if(Character.isWhitespace(array[i]))
                whitespaces++;
         }
         
        System.out.println("The number of letters is " + letters + ".");
        System.out.println("The number of digits is " + digits + ".");
        System.out.println("The number of lower case letters is " + lowerCase+ ".");
        System.out.println("The number of upper case letters is " + upperCase + ".");
        System.out.println("The number of white spaces is " + whitespaces + ".");

    }
      
}

}

在我手动终止它之前,我输出到控制台的是以下内容的连续循环:

You entered: 
hi there
hi has 2 characters.
there has 5 characters.
The total number of characters entered without spaces: 7
The number of letters is 7.
The number of digits is 0.
The number of lower case letters is 7.
The number of upper case letters is 0.
The number of white spaces is 1.

所有信息都是准确的,但我不希望它接受少于 4 个令牌或超过 8 个令牌的计数,然后我希望它在提供一次此输出后停止。

非常感谢任何见解。

问题是您必须以某种方式停止主 for 循环;修复它的最简单方法是引入布尔变量,该变量将向应用程序指示循环应该这样终止:

        public static void main(String[] args) {

    ArrayList<String> tokenizedInput = new ArrayList<>();
    String sentenceRetrieved = "";

    boolean isConditionsMet = false;
    while (!isConditionsMet) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Please type a sentence containing at least 4 words, with a maximum of 8 words: ");
        sentenceRetrieved = sc.nextLine();
        StringTokenizer strTokenizer = new StringTokenizer(sentenceRetrieved);
        int count = strTokenizer.countTokens();
        if (count <= 4 || count >= 8) {
            continue;
        } else {
            isConditionsMet = true;
        }

        while (strTokenizer.hasMoreTokens()) {
            tokenizedInput.add(strTokenizer.nextToken());
        }
    }

    // printing out the sentence
    System.out.println("You entered: ");
    System.out.println(sentenceRetrieved);

    // count the characters in each w
    int totalLength = 0;

    for (String each : tokenizedInput) {
        totalLength += each.length();
        System.out.println(each + " has " + each.length() + " characters.");
    }

    System.out.println("The total number of characters entered without spaces: " +
            sentenceRetrieved.replace(" ", "").length());

    /*
     * Setting up a character array and determining how many
     * letters, digits, lower case letters, upper case letters and white spaces in the input.
     */

    char[] array;
    int letters = 0,
            digits = 0,
            lowerCase = 0,
            upperCase = 0,
            whitespaces = 0;

    array = sentenceRetrieved.toCharArray();
    for (int i = 0; i < array.length; i++) {
        if (Character.isLetter(array[i]))
            letters++;
        if (Character.isDigit(array[i]))
            digits++;
        else if (Character.isUpperCase(array[i]))
            upperCase++;
        else if (Character.isLowerCase(array[i]))
            lowerCase++;
        else if (Character.isWhitespace(array[i]))
            whitespaces++;
    }

    System.out.println("The number of letters is " + letters + ".");
    System.out.println("The number of digits is " + digits + ".");
    System.out.println("The number of lower case letters is " + lowerCase + ".");
    System.out.println("The number of upper case letters is " + upperCase + ".");
    System.out.println("The number of white spaces is " + whitespaces + ".");
}

此外,关于您的代码的小提示 - 从未使用过 totalLength。

另一种方法是用标签标记你的无限外循环:

// your label here.
outerLoop:
while (true) {
    if (..condition..) {
        // this statement will break corresponding marked loop.
        break outerLoop;
    }
}

您正在使用哪个 IDE?你知道调试器是什么吗? 在调试器中尝试您的代码。

我认为您的代码是正确的,但据我所知“while 始终为真”。所以它无休止地运行。只需创建一个布尔值并在最后将其设置为 false。

if (strTokenizer.countTokens ( ) >= 4 && strTokenizer.countTokens ( ) <= 8) 
            {
                int count = strTokenizer.countTokens ( ); 
                System.out.println (count); 
            } 
            else 
            {
                System.out.println ("Error. Please type a sentence containing at least 4 words, with a maximum of 8 words"); 
                System.exit (1); 
            }
            
            for (int i = 0; i <= strTokenizer.countTokens ( ); i++) 
            {
                tokenizedInput.add (i, strTokenizer.nextToken ( ) ); 
            }

            // printing out the sentence
            System.out.println ("You entered: ");
            System.out.println (sentenceRetrieved);

            // count the characters in each word
            int totalLength = 0;