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

Posted

技术标签:

【中文标题】在java中从用户获取整数数组输入【英文标题】:Get integer array input from user in java 【发布时间】:2012-01-29 21:13:00 【问题描述】:

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

6

34 12 7 4 22 15

3

3 6 2

第一行表示第二行中的整数个数。 我首先尝试将第二行作为字符串读取,然后使用 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。如果有任何其他方法可以实现这一点,我就是游戏。

【问题讨论】:

我的猜测是 arraySize = Integer.parseInt(br.readLine());引发异常?我说的对吗? StringTokenizer 有那么耗时吗?你分析了吗? 这是作业吗?如果是,请添加homework标签... 我在略读并错过了您已经尝试过的提及后,在我的回答中建议了 StringTokenizer。我也很好奇你为什么说 StringTokenizer 花了很长时间。运行需要很长时间还是编程需要很长时间?前者可能会暴露您系统上的问题。后者会暴露你的实现设计中的问题。 【参考方案1】:

为了将来参考,这里有一个使用 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));
    

【讨论】:

太棒了。谢谢。像魅力一样工作:) 为什么需要第二台扫描仪? 为了清晰和基本验证。我想确保用户期望的数字都在第二行,而不是分散在不同的行上。【参考方案2】:

您说过可以在 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.
         */

    


我意识到这个回复已经晚了好几年,但是当我遇到这个问题时,我正在寻找一个不同的问题。这里的答案让我非常困惑,直到我意识到这不是我想要的。看到这仍然显示在谷歌上,我决定发布这个。

【讨论】:

【参考方案3】:
    Scanner in = new Scanner(inputFile);
    int[] ints = Arrays.stream(in.nextLine().split("\\s+"))
      .mapToInt(Integer::parseInt).toArray();

【讨论】:

【参考方案4】:

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

【讨论】:

这很好用。实际上,这比 StringTokenizer 方法要快。谢谢@yock【参考方案5】:

如果您的输入是“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

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

【讨论】:

我没有格式化我在上述问题中的输入。实际上,输入在 4 个不同的行中。我已经更新了上面的输入。 那么在这种情况下,我会忽略 count 行并在包含实际数据的行上使用 .split() 方法。或者使用 StringTokenizer。这里不太可能存在性能问题 - 如果有那么您可以重组您的输入吗?当然是在分析之后。 重新阅读问题 - 这是用户输入的数据吗?那为什么要让他们有机会提供相互矛盾的信息,例如:“3”“1 2”【参考方案6】:
new Scanner(System.in).useDelimiter("[ ]") 

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

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

应该这样做。

【讨论】:

该死,我的正则表达式生锈了。括号之间的空格可以很好地工作,现在无法测试。

以上是关于在java中从用户获取整数数组输入的主要内容,如果未能解决你的问题,请参考以下文章

java中从控制台让用户输入参数的语句是啥?

如何从java控制台获得用户输入?

如何从java控制台获得用户输入?

java中从控制台输入代码问题

如何在状态挂钩中从获取请求中设置数据(对象数组)?

如何从用户获取整数输入并将其存储到数组中? [关闭]