如何使用.nextInt .hasNextInt或.hasNext读取单行输入的整数而不会造成阻塞?

时间:2014-11-15 21:52:08

标签: java arrays

我正在尝试在由空格分隔的单行上一个接一个地读取整数。 这段代码可以在不使用.nextLine的情况下工作,而无需将输入转换为字符串,然后转换为整数? 挑战是“不使用.nextLine”,不要使用字符串或转换。读取纯整数并从while循环退出。

public static void scannerInts (){          
        int[] list = new int[100];
        int n=0;            
        System.out.print("Input data into one line, [ENTER] to finish: ");            
        Scanner input = new Scanner(System.in);
        while (input.hasNext()) {
            if (input.hasNextInt()) {
                list[n++]= input.nextInt();
            } else {
                input.next();
            }
        }
        for (int i=0;i<n;i++)
             System.out.print(list[i] + " ");
}
PD:我尝试过Stack OverFlow的许多回复,似乎没什么用。

1 个答案:

答案 0 :(得分:1)

问题是System.in是一个无限的流。调用hasNextXXX会导致System.in提示扫描程序是否在已读取的内容中找不到令牌。用户需要输入一些非整数来终止列表。

然而,您可以使用第二个扫描仪,因为扫描仪可以扫描字符串,例如:

Scanner in = new Scanner(System.in);
System.out.print("Enter a list of integers: ");

List<Integer> list = new ArrayList<>();
Scanner line = new Scanner(in.nextLine());

// optional
line.useDelimiter("\\D+");

while(line.hasNextInt()) {
    list.add(line.nextInt());
}

System.out.println("You entered " + list);

使用单个扫描仪,您还可以使用findInLine

for(String token; (token = in.findInLine("-?[1-9]\\d*")) != null;) {
    list.add(Integer.valueOf(token));
}