如何从 java 中的用户输入(扫描仪)计算脚本中的字符串、数字和双精度数?

How to count the Strings, numbers, and doubles in a script from the users' input (Scanner) in java?

我是初学者,从别人的问题中学到的东西,我尝试了几种不同的方法,但我认为我遇到以下问题的问题是我无法弄清楚其中的逻辑我的代码。如果有人可以提出一个解释代码逻辑的解决方案,我将不胜感激。 我应该以 method() 的格式创建一个方法,它会提示用户输入一个包含字符串、数字和双精度数的脚本。该方法应计算字符串、数字和双打的数量,并打印出字符串、数字和双打的列表。我知道该方法打印字符串、数字和双精度列表的部分,但似乎我无法让计数器对它们进行计数。到目前为止我得到了这个:

 import java.util.Scanner;
 public class Games {

    private Scanner input;

 public Games() {

  input = new Scanner(System.in);

 }

 public void textParser() {

  System.out.println("Enter a Script");
  int intCount = 0;
  int dblCount = 0;
  int strCount = 0;

  while(input.hasNext()) {
   if(input.hasNextInt()) {
    int num = input.nextInt();
    System.out.println(num);
    intCount++;
 }else if(input.hasNextDouble()) {
   double value = input.nextDouble();
   System.out.println(value);
   dblCount++;
 }else {
   String oneWord = input.next();
   System.out.println(oneWord);
   strCount++;
 }
}

System.out.println("Number of integers: " + intCount);
System.out.println("Number of doubles: " + dblCount);
System.out.println("Number of strings: " + strCount);


}

  public static void main(String[] args) {
  Games demo = new Games();
  demo.textParser();
 }

}

预期输入和输出示例:

 Enter a Script
 32 quick brown foxes jump over 65 lazy dogs and few doubles are 43.3 
 and 76.9

 32
 65
 Number of integers: 2
 43.3
 76.9
 Number of doubles: 2
 quick
 brown 
 foxes 
 jump 
 over
 lazy 
 dogs 
 and 
 few 
 doubles 
 are
 and
 Number of strings: 12

实际输出:

 32
 65
 43.3
 76.9
 quick
 brown 
 foxes 
 jump 
 over
 lazy 
 dogs 
 and 
 few 
 doubles 
 are
 and

接近开始时,您说 while(scanner.hasNext()。这意味着,只要程序运行,循环中的所有代码都会被执行。

您已将打印计数器的语句放在循环之外,并以某种方式设计您的代码,使您永远不会离开该循环。

所以你需要某种退出条件。比方说,如果其中一个字符串是 exit,则退出循环并打印计数器:

while (input.hasNext()) {
    if (input.hasNextInt()) {
        // ...
    } else if (input.hasNextDouble()) {
        // ...
    } else {
        String oneWord = input.next();
        System.out.println(oneWord);
        strCount++;

        if (oneWord.equals("exit")) {
            input.close();
            break;
        }
    }
}

或者,如果您不想在其中放置 "exit",请执行以下操作:

int intCount = 0, doubleCount = 0, stringCount = 0;

while (input.hasNextLine()) {
    String[] segments = input.nextLine().split(" ");

    for (String segment : segments) {
        System.out.println(segment);

        try {
            int asInt = Integer.parseInt(segment);
            intCount++;
        } catch (NumberFormatException e) {
            try {
                double asDouble = Double.parseDouble(segment);
                doubleCount++;
            } catch (NumberFormatException e2) {
                stringCount++;
            }
        }
    }

    System.out.println("Number of integers: " + intCount);
    System.out.println("Number of doubles: " + doubleCount);
    System.out.println("Number of strings: " + stringCount);
}

扫描程序将继续读取,直到找到 "end of file" 条件。

当您从 stdin 读取时,如果您使用 < 样式重定向,那将是在您发送 EOF 字符(通常是 ^d 在 Unix 上)或文件末尾。

你需要某种退出条件

if (oneWord.equals("exit")) {
            input.close();
            break;
 }

另一种方法是在输入 Ctrl+Z 后发送 EOF。