Java输入验证,仅循环两次,未检测到大写/小写字符

问题描述

我希望我的输入最少为4个字符串,最多为8个字符串。我将其标记化以进行练习。如果输入不在这些参数范围内,我的循环将重新运行,但仅重新运行一次,然后继续执行程序的其余部分。我觉得我使用了错误的循环进行验证,因为我认为此时我将只需要while / if到无穷大。

最后,最后,当试图确定多少个大写或小写字符时,我的结果返回一个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++;

在您的代码中,只有在isUpper错了的情况下,您才检查isLower!isCharacter

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

,

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

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

要解决第二个问题,请摆脱第一个问题。一旦确定这是一封信,就无需进行其他任何测试。一旦确定是字母,也可以只测试上下限。

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