扫描仪没有停止

时间:2012-06-30 12:02:40

标签: java collections io arraylist

请查看以下代码。我试图按升序管理给定的数字。

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()'吗?请帮我解决这两个问题。

感谢。

5 个答案:

答案 0 :(得分:4)

按Enter键的结果将是一个行分隔符,其字符被视为分隔符(默认情况下,请参阅Character.isWhitespace())并被跳过。因此Scanner正在等待进一步的输入,这些输入永远不会到来,hasNextInt()将阻止。输入非整数的东西,例如.,以使循环终止:

  

1 2 5 3 7。

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:1)

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

按Enter键后按ctrl + D. 您可以将数字分隔为任何空格。

答案 3 :(得分:1)

如果您希望仅在2,1,6,7,3这一行上输入,则可能更容易使用扫描仪的nextLine()

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

一旦您按Enter键,这将终止扫描仪。此时,您在String中输入,您必须解析该字符串并输出所有数字。

另请注意,您忘记了参数化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);
    }

  }
}

答案 4 :(得分:0)

您的代码应该有效。你只需要添加一种方法来摆脱循环。最好将扫描值保存在局部变量中,以备再次引用时使用。

可能会添加:

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

    numbers.add(i);
}