在java中从用户获取整数数组输入

时间:2011-12-29 12:49:14

标签: java string java.util.scanner

我需要从用户那里获得一系列整数。 系统不会提示用户输入数字。输入将采用以下形式:

6

34 12 7 4 22 15

3

3 6 2

第一行表示第二行中的整数数。 我首先尝试将第二行作为String读取,然后使用StringTokenizer将其分解为代码中的整数。正常情况发生在我的程序中很多,这很费时间 我需要直接阅读它们。 我记得在C ++中它过去相当简单。以下代码段用于执行此操作。

for(i=0;i<6;i++)
cin>>a[i];

为实现这一目标,我使用了java.util.Scanner,我的代码如下所示:

InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
Scanner src = new Scanner(System.in);

for(x=0;x<2;x++){
    arraySize = Integer.parseInt(br.readLine());

    for(i=0;i<arraySize;i++)
        array[i] = src.nextInt();
}

在这种情况下,我收到以下错误:

Exception in thread "main" java.lang.NumberFormatException: For input string: "34 12 7 4 22 15"

我愿意接受建议,而不是单独坚持使用Scanner。如果有任何其他方法可以实现这一点,我就是游戏。

6 个答案:

答案 0 :(得分:10)

为了将来参考,这里有一种方法可以使用Scanner类:

import java.util.Arrays;
import java.util.Scanner;


public class NumberReading {
    public static int [] readNumsFromCommandLine() {

        Scanner s = new Scanner(System.in);

        int count = s.nextInt();
        s.nextLine(); // throw away the newline.

        int [] numbers = new int[count];
        Scanner numScanner = new Scanner(s.nextLine());
        for (int i = 0; i < count; i++) {
            if (numScanner.hasNextInt()) {
                numbers[i] = numScanner.nextInt();
            } else {
                System.out.println("You didn't provide enough numbers");
                break;
            }
        }

        return numbers;
    }

    public static void main(String[] args) {
        int[] numbers = readNumsFromCommandLine();
        System.out.println(Arrays.toString(numbers));
    }
}

答案 1 :(得分:3)

你说你可以在C ++中使用以下代码:

for(i=0;i<6;i++) 
cin>>a[i];

如果这是您在C ++中使用的,为什么不使用它?

for(i=0;i<6;i++)
a[i] = input.nextInt();

假设扫描仪声明是:

Scanner input = new Scanner(System.in);

从我所见,人们正试图为你编写整个程序。但是,正如你所说,你可以使用C ++代码解决这个问题,我只是为你将代码转换为Java。

如果你想要完整的代码,请点击这里:

import java.util.Scanner;

public class arrayFun {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        // Create a new array. The user enters the size
        int[] array = new int[input.nextInt()];

        // Get the value of each element in the array
        for(int i = 0; i < array.length; i++)
            array[i] = input.nextInt();

        /* Note that the user can type the following:
         * 6
         * 34 12 7 4 22 15
         * This will set the array to size 6
         * array[0] = 34;
         * array[1] = 12;
         * etc.
         */

    }

}

我意识到这种反应已经晚了很多年,但当我碰到这个时,我正在寻找一个不同的问题。这里的答案让我很困惑,直到我意识到这不是我想要的。看来这仍然出现在谷歌上,我决定发布这个。

答案 2 :(得分:2)

    Scanner in = new Scanner(inputFile);
    int[] ints = Arrays.stream(in.nextLine().split("\\s+"))
      .mapToInt(Integer::parseInt).toArray();

答案 3 :(得分:0)

如果您的输入是“6 34 12 7 4 22 15 3 3 6 2”,由空格分隔,那么它将被br.readLine()一次性读取。正如您所见,您无法将“6 34 12 7 4 22 15 3 3 6 2”传递给parseInt

对于这种情况,我建议你在String.split()返回的字符串上调用br.readLine(),然后你将得到一个字符串数组,这些字符串可以依次传递给Integer.parseInt()

答案 4 :(得分:0)

您可以尝试使用StringTokenizer,但如果您知道提前使用的分隔符,只需使用String.split()

答案 5 :(得分:0)

new Scanner(System.in).useDelimiter("[ ]") 

应该帮助你避免Vanathi在他的回答中提到的问题。至于知道数组的大小,比如:

br.readLine().split("[ ]").length;

应该这样做。