【问题标题】:Scanner is not stopping扫描仪没有停止
【发布时间】:2012-06-30 12:02:39
【问题描述】:

请看下面的代码。这是我按升序管理给定数字的尝试。

import java.io.*;
import java.util.*;
import java.util.ArrayList;

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

        List<Integer> numbers = new ArrayList();        
        Scanner scan = new Scanner(System.in);

        while(scan.hasNextInt())
        {
            numbers.add(scan.nextInt());
        }


        Collections.sort(numbers);

        System.out.println(numbers);
    }
}

将输入插入为 2,1,6,7,3

回车。

现在,扫描器没有退出 while 循环,因为它没有给出任何输出。我在这里做错了什么?即使你设法得到它,输出也会被括号括起来,比如“ [1] [2] [3] ”。这是为什么?那是因为我没有调用 'Integer.parseInt()' 吗?请帮我解决这两个问题。

谢谢。

【问题讨论】:

    标签: java collections io arraylist


    【解决方案1】:

    回车的结果将是一个行分隔符,其字符被视为分隔符(默认情况下,请参阅Character.isWhitespace())并被跳过。因此Scanner 正在等待进一步的输入,而这些输入永远不会到达,hasNextInt() 将阻塞。输入不是整数的内容,例如 .,以导致循环终止:

    1 2 5 3 7 .

    【讨论】:

      【解决方案2】:

      这个循环永远不会退出(只要你输入整数),因为没有break条件

      while(scan.hasNextInt()){
        numbers.add(scan.nextInt());
      }
      

      如果你想让你的循环停止,比如说你只需要获取 5 个整数,那么你可以这样做:

      while(scan.hasNextInt()){
        numbers.add(scan.nextInt());
        if(numbers.size() == 5) break;
      }
      

      【讨论】:

      • 这不是真的,循环会在你输入非整数符号的那一刻停止。
      • @hovanessyan 对,感谢您的指点。我更新了我的答案
      • @hovanessyan 代码有效,这只是结束循环的另一个例子
      • 感谢您的回复。我很感激。 :) 我实际上是在尝试解决这个问题codechef.com/problems/TSORT 但我放弃了那个网站; Java 的人很少,因为他们的大部分挑战由于时间限制无法在 Java 中完成。反正对 C 人有好处
      【解决方案3】:

      扫描器继续扫描直到输入结束,或者直到它无法读取(例如,当在文本中检测到非整数时)。

      按回车后按 ctrl + D。 您可以使用任何空格分隔数字。

      【讨论】:

        【解决方案4】:

        如果您只想在2,1,6,7,3 这样的一行上输入,可能会更容易使用扫描仪的nextLine()

        Scanner scan = new Scanner(System.in);
        String consoleInput = scan.nextLine();
        

        一旦你按下回车,这将终止扫描程序。此时,您的输入是一个字符串,您必须解析该字符串并取出所有数字。

        另请注意,您忘记参数化 ArrayList()。

        以下是您的源代码的可能改编版本:

        import java.util.ArrayList;
        import java.util.Collections;
        import java.util.List;
        import java.util.Scanner;
        
        public class Main {
          public static void main(String[] args) {
        
            Scanner scan = new Scanner(System.in);
        
            String consoleInput = scan.nextLine();
        
            List<Integer> numbers = new ArrayList<Integer>();
        
        
            if (consoleInput.length() > 0 && consoleInput.contains(",")) {
        
              String[] numbersAsStrings = consoleInput.split(",");
        
              for (String tNumberAsString : numbersAsStrings) {
                try {
                  int tNumber = Integer.parseInt(tNumberAsString);
        
                  numbers.add(tNumber);
        
                } catch (NumberFormatException nfe) {
                  System.out.println(tNumberAsString + " is not a number");
                }
              }
        
              Collections.sort(numbers);
        
              System.out.println(numbers);
        
            } else {
              System.out.println("Nothing to sort!");
              System.out.println(numbers);
            }
        
          }
        }
        

        【讨论】:

          【解决方案5】:

          您的代码应该可以工作。您只需要添加一种方法来跳出循环。将扫描的值保存在局部变量中也是一个好主意,以防您需要再次引用它。

          可能会添加:

          while(scan.hasNextInt()){
              int i=scan.nextInt();
                  if(i==-1)
                      break;
          
              numbers.add(i);
          }
          

          【讨论】:

          • 如果您未能满足“scan.hasNextInt()”条件,则循环将结束 - 例如,输入“exit”或“。”按照建议。
          • @honanessyan 是的,它会的,我只是想展示一种替代方法(使其更明确)。
          • 是的,代码可以工作,但我认为重点是让用户输入任意数量的数字。 (我说的是 number.size()==5
          • 是,除了 -1。这只是打破循环的另一种方法的一个例子......我假设这是一个家庭作业问题,这个人是 Java 新手。牢记这一点,很高兴看到替代方法。例如,如果该人需要包含字符串,那么如果他们尝试输入非字符串,则很难找到跳出循环的方法。