在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中从用户获取整数数组输入的主要内容,如果未能解决你的问题,请参考以下文章