Проверка ввода Java, только циклы дважды, не обнаруживая символы верхнего / нижнего регистра

#java #arrays #for-loop #while-loop #tokenize

#java #массивы #для цикла #цикл while #маркировать

Вопрос:

Я хочу, чтобы мой ввод состоял минимум из 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.
  

Ответ №1:

Как насчет чего-то подобного. Он будет продолжать запрашивать до тех пор, пока не будут выполнены условия.

 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 amp;amp; count >= 4) {
        break;
    }
}
  

Чтобы устранить вашу вторую проблему, избавьтесь от первой еще. Как только вы определяете, что это буква, вы не проводите никакого другого тестирования. Вы также можете просто проверить верхний / нижний, как только выясните, что это буква.

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

Комментарии:

1. Я думаю, что он не получал нужное количество верхних, нижних и пробелов из-за if / elses.

2. Это была одна из проблем.

3. Это именно так. Я действительно ценю вашу помощь. Я знал, что мне нужно время и если, но я собирался продолжать циклы кодирования на этом этапе. Я также ценю проблему «case». Теперь, когда я это вижу, это приобретает полный смысл. Спасибо!

Ответ №2:

Если 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 , что, по моему мнению, неверно.

Вот почему ваши подсчеты были неверными

Комментарии:

1. Идеальный. Я действительно ценю понимание. Спасибо!