优化-在java中将std输入转换为整数数组
我想读取每一行输入,将数字存储在int[]数组中,进行一些计算,然后尽快进入下一行输入 输入(标准输入法)优化-在java中将std输入转换为整数数组,java,arrays,optimization,stdin,Java,Arrays,Optimization,Stdin,我想读取每一行输入,将数字存储在int[]数组中,进行一些计算,然后尽快进入下一行输入 输入(标准输入法) 2 4 8 15 10 5 12 14 3999 -284 -71 0 -213 18 4 2 0 这是一个纯粹的优化问题,在现实世界中并不完全是好的实践,因为我假设输入是完美的。我感兴趣的是如何改进当前从stdin获取输入并将其表示为整数数组的方法。我见过使用scanner的方法,它们使用getnextin
2 4 8
15 10 5
12 14 3999 -284 -71
0 -213 18 4 2
0
这是一个纯粹的优化问题,在现实世界中并不完全是好的实践,因为我假设输入是完美的。我感兴趣的是如何改进当前从stdin获取输入并将其表示为整数数组的方法。我见过使用scanner的方法,它们使用getnextint方法,但我在多个地方读过scanner比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){
}
BufferedReader bufferedInput=新的BufferedReader(新的InputStreamReader(System.in));
弦线;
字符串[]线性排列;
试一试{
//只有“0”的一行表示std输入结束
而((line=bufferedInput.readLine())!=“0”){
lineArray=line.split(“\\s+”);//是“\\s+”优化的正则表达式吗
int arrlength=lineArray.length;
int[]lineInt=新int[arrlength];
for(int i=0;i
从其他问题来看,parseint似乎是将字符串转换为整数的最有效方法。任何启蒙都会大有裨益
谢谢:)
编辑1:删除GCD信息和“算法”标记
编辑2:(希望)使问题更简洁,语法更精确首先,我只想指出,在您的特定示例中进行优化是完全没有意义的 以你为例,大多数人都会同意最好的解决方案不是最优的。相反,最具可读性的解决方案是最好的
话虽如此,如果您想要最佳的解决方案,那么就不要使用
Scanner
,不要使用BufferedReader.readLine()
,不要使用String.split
,也不要使用Integer.parseInt(…)
而是使用BufferedReader.read()
一次读取一个字符,然后手动解析并将其转换为int
。您还需要实现自己的“可扩展数组的int
”类型,其行为类似于ArrayList
这是大量(不必要的)工作,需要维护更多的代码行。坏主意…我同意Stephen所说的,解析的速度可能会大大超过实际I/O完成的速度,因此改进解析不会给你带来太多好处 说真的,除非您构建了整个系统,对其进行了分析,并发现效率低下的解析是阻止其达到性能目标的原因,否则不要这样做 但是严格地说,这只是一个练习,而且由于一般原则在其他地方可能有用,下面是一个如何直接从字符串解析它的示例 这些假设是:
ArrayList
,这对于存储原语来说是个坏主意,装箱/取消装箱的开销可能会抵消解析速度方面的所有改进。在现实世界中,我会使用
公共静态列表解析(字符串s){
List ret=new ArrayList();
int符号=1;
int电流=0;
布尔inNumber=false;
对于(int i=0;i 如果(c>='0'&&c在此行lineArray=line.split(\\s+))<代码> > ReXEX <代码> S+为每一行重新编译。要优化,考虑用CHARI处理字符串char就不能说明您实际上想要问什么。任何GCD算法都需要查看每个解析的整数,因此您不能避免解析输入中的每个整数。不要担心后者(这正是你目前担心的——对吧?@j_random_hacker以一种屈尊的方式)我在问如何从stdin获得这种形式的输入(用空格分隔的数字)对于整数数组,使用尽可能少的运行时间。我想我只需要提供多一点背景上下文。尽管GCD algo在运行时占主导地位,但我仍然希望我的解决方案的输入和显示输出部分尽可能快,请注意,这不是一个真实的示例,这更像是一个练习,如果我的行话这是不正确的,我对java和一般编程非常陌生。有时提供一些额外的上下文是好的,但在这里我感到困惑,因为您首先谈到了GCD,并使用了算法标记,GCD将(我确定)控制运行时间,因此很难说你真的只是在问如何有效地读取整数数组。我建议删除所有与GCD相关的内容,并删除算法标记(也不要太担心这一步需要多长时间:-)@j_random_hacker我知道说谢谢不太好,但是谢谢。我已经做了编辑,现在这个问题应该更合理/更仔细,即stdin(以指定格式)->int[]尽可能快。
public static List<Integer> parse(String s) {
List<Integer> ret = new ArrayList<Integer>();
int sign = 1;
int current = 0;
boolean inNumber = false;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c >= '0' && c <= '9') { //we assume a sensible encoding
current = current * 10 + sign * (c-'0');
inNumber = true;
}
else if (c == ' ' && inNumber) {
ret.add(current);
current = 0;
inNumber = false;
sign = 1;;
}
else if (c == '-') {
sign = -1;
}
}
if (inNumber) {
ret.add(current);
}
return ret;
}