【发布时间】:2016-09-04 03:58:31
【问题描述】:
我想读取输入的每一行,将数字存储在 int[] 数组中以进行一些计算,然后尽快进入下一行输入。
输入(标准输入)
2 4 8
15 10 5
12 14 3999 -284 -71
0 -213 18 4 2
0
这是一个纯粹的优化问题,在现实世界中并不是完全好的做法,因为我假设输入完美。我对如何改进当前从标准输入获取输入并将其表示为整数数组的方法感兴趣。我见过使用扫描仪的方法,他们使用 getnextint 方法,但是我在多个地方阅读过扫描仪比 BufferedReader 慢得多。
这种输入步骤的吸收可以改进吗?
当前方法
BufferedReader bufferedInput = new BufferedReader(new InputStreamReader(System.in));
String line;
String[] lineArray;
try{
// a line with just "0" indicates end of std input
while((line = bufferedInput.readLine()) != "0"){
lineArray = line.split("\\s+"); // is "\\s+" the optimized regex
int arrlength = lineArray.length;
int[] lineInt = new int[arrlength];
for(int i = 0; i < arrlength; i++){
lineInt[i] = Integer.parseInt(lineArray[i]);
}
// Preform some operations on lineInt, then regenerate a new
// lineInt with inputs from next line of stdin
}
}catch(IOException e){
}
从其他问题来看Difference between parseInt and valueOf in java?parseint 似乎是将字符串转换为整数的最有效方法1。任何启示都会有很大帮助。
谢谢你:)
编辑 1:删除 GCD 信息和“算法”标签
编辑 2:(希望)使问题更简洁,语法修正
【问题讨论】:
-
在这一行中
lineArray = line.split("\\s+")正则表达式\s+为每一行重新编译。要优化,请考虑逐字符处理字符串 -
我不知道你到底想问什么。任何 GCD 算法都需要查看每个解析的整数,因此您无法避免解析输入中的每个整数。另外我希望 GCD 运行时主导解析时间,所以没有必要担心后者(这是你目前担心的——对吧?)
-
@j_random_hacker 以一种居高临下的方式我在问如何以这种形式(数字以空格分隔)从标准输入获取输入到整数数组,并且运行时间尽可能短。我想我会提供更多的背景背景。尽管 GCD 算法在运行时占主导地位,但我仍然希望我的解决方案的输入和显示输出部分尽可能快,注意这不是一个真实世界的例子,如果我的行话不正确,它更像是一个练习道歉我非常Java 和一般编程新手。
-
提供一些额外的上下文有时会很好,但在这里我很困惑,因为您首先谈论 GCD,并使用了
algorithm标签,而 GCD 将(我确定)支配运行时间,所以很难说你真的只是在询问如何有效地读取整数数组。我建议删除所有与 GCD 相关的内容并删除algorithm标签(也不要太担心这一步需要多长时间:-) -
@j_random_hacker 我知道说谢谢并不好,但是谢谢。我已经进行了编辑,现在问题应该更有意义/更简洁,即标准输入(以指示的格式)-> int [] 尽可能快。
标签: java arrays optimization stdin