使用Scanner在一行上接受多个整数

时间:2014-10-19 00:54:20

标签: java string java.util.scanner

用户需要输入一定数量的整数。相反,他们一次输入一个整数,我想让它们可以在一行上输入多个整数,然后我希望这些整数在数组中转换。例如,如果用户输入:56 83 12 99,那么我想要创建一个{56, 83, 12, 99}

的数组

在Python或Ruby等其他语言中,我会使用.split(" ")方法来实现这一目标。据我所知,Java中没有这样的东西存在。关于如何接受用户输入并基于此创建数组的任何建议都在一条线上?

3 个答案:

答案 0 :(得分:5)

使用Scanner.nextInt()方法可以解决问题:

输入:

  

56 83 12 99

代码:

import java.util.Scanner;

class Example
{
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        int[] numbers = new int[4];
        for(int i = 0; i < 4; ++i) {
            numbers[i] = sc.nextInt();
        }
    }
}

@ user1803551关于Scanner.hasNext()如何实现此目的的请求:

import java.util.*;

class Example2
{
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        ArrayList<Integer> numbers = new ArrayList<Integer>();
        while (sc.hasNextInt()) { // this loop breaks there is no more int input.
            numbers.add(sc.nextInt());
        }
    }
}

答案 1 :(得分:1)

Makoto的回答使用Scanner#nextLineString#split执行您想要的操作。 mauris的答案使用Scanner#nextInt,如果您愿意更改输入要求,使得最后一个条目不是整数,则有效。我想说明如何让Scanner#nextLine使用您提供的确切输入条件。虽然不那么实际,但它确实具有教育价值。

public static void main(String[] args) {

    // Preparation
    List<Integer> numbers = new ArrayList<>();
    Scanner scanner = new Scanner(System.in);
    System.out.println("Enter numbers:");

    // Get the input
    while (scanner.hasNextInt())
        numbers.add(scanner.nextInt());

    // Convert the list to an array and print it
    Integer[] input = numbers.toArray(new Integer[0]);
    System.out.println(Arrays.toString(input));
}

在第一次提示时给出输入10 11 12,程序会存储它们(Scanner有一个private缓冲区),但后来不断要求更多输入。这可能会让人感到困惑,因为我们给出了循环通过hasNext的3个整数,并期望当第4次调用时,将没有整数,循环将会中断。

要了解它,我们需要查看文档:

  

hasNextnext方法[及其原始类型的伴随方法] 可以阻止等待进一步输入。 hasNext方法块是否与其关联的next方法是否会阻止无关。

(强调我的)和hasNextInt

  

当且仅当此扫描程序的下一个标记是有效的int值时,才返回true

我们使用scanner初始化InputStream,这是连续数据流。在第4次拨打hasNextInt时,扫描仪&#34; 不知道&#34;如果有一个下一个int或因为流仍处于打开状态且数据预计会到来。从文档中可以得出结论,我们可以说hasNextInt

  

如果此扫描程序的下一个标记是有效的int值,则返回true,如果它不是有效的int,则返回false,如果它不知道下一个标记是什么,则返回阻止

所以我们需要做的是在获得输入后关闭流:

// Get the input
numbers.add(scanner.nextInt());
System.in.close();
while (scanner.hasNextInt())
    numbers.add(scanner.nextInt());

这次我们要求输入,获取所有内容,关闭流以通知scanner hasNextInt不需要等待更多输入,并通过迭代存储它。这里唯一的问题是我们已关闭System.in,但如果我们不需要更多输入就可以了。

答案 2 :(得分:0)

String#split存在,但你必须做更多的工作,因为你只是回来了。

获得拆分后,将每个元素转换为int,并将其放入所需的数组中。

final String intLine = input.nextLine();
final String[] splitIntLine = intLine.split(" ");
final int[] arr = new int[splitIntLine.length];
for(int i = 0; i < splitIntLine.length; i++) {
    arr[i] = Integer.parseInt(splitIntLine[i]);
}
System.out.println(Arrays.toString(arr));  // prints contents of your array