Java 输入验证,只循环两次,不检测 Upper/Lower 个大小写字符

Java Input Validation, only loops twice, not detecting Upper/Lower Case Characters

我希望我的输入最少为 4 个字符串,最多为 8 个。我正在对它们进行标记以供练习。如果我的输入在这些参数之外,我的循环将重新运行,但只会重新运行一次并继续执行程序的其余部分。我觉得我使用了错误的循环进行验证,因为我认为此时 while/if 到无穷大。

最后,在尝试确定有多少个字符是大写或小写时,我的结果 returns 计数为 0,但我的字母、数字和空格计数是准确的。

非常感谢任何见解。

这是我的代码:

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);

    // checking to ensure the string has 4-8 words
    while (strTokenizer.hasMoreTokens()) {
        if (strTokenizer.countTokens() > 8 || strTokenizer.countTokens() < 4) {
            System.out.println("Please re-enter a sentence with at least 4 words, and a maximum of 8: ");
            //sentenceRetrieved = null;
            //tokenizedInput.removeAll(tokenizedInput);
            sentenceRetrieved = sc.nextLine();
            while (strTokenizer.hasMoreTokens()) {
                tokenizedInput.add(strTokenizer.nextToken());
                
            }

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

            System.out.println("Thank you.");
            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 ++;
            else 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 + ".");

    }
      


}

我的输出如下所示:

Please type a sentence containing at least 4 words, with a maximum of 8 words: 
hi there3
Please re-enter a sentence with at least 4 words, and a maximum of 8: 
hi there3
You entered: 
hi there3
hi has 2 characters.
there3 has 6 characters.
The total number of characters entered without spaces: 8
The number of letters is 7.
The number of digits is 1.
The number of lower case letters is 0.
The number of upper case letters is 0.
The number of white spaces is 1.

isLetter,可上可下。试试这个。

if (Character.isLetter(array[i])){
    letters ++;
    if(Character.isUpperCase(array[i]))
        upperCase++;
    else if(Character.isLowerCase(array[i]))
        lowerCase++;
} else if(Character.isDigit(array[i])){
    digits++;
} else if(Character.isWhitespace(array[i]))
    whitespaces++;

在您的代码中,您仅在 !isCharacter 时才检查 isUpperisLower,我认为这是错误的。

这就是您的计数不正确的原因

这样的事情怎么样。会一直提示,直到满足条件。

while (true) {
    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 <= 8 && count >= 4) {
        break;
    }
}

要解决第二个问题,请解决第一个问题。一旦你确定它是一封信,你就不会做任何其他测试。一旦确定它是一个字母,您也可以只测试 upper/lower。

if (Character.isLetter(array[i]))
                letters++;
if (Character.isDigit(array[i])) {
   ..
} else if(