Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
优化-在java中将std输入转换为整数数组_Java_Arrays_Optimization_Stdin - Fatal编程技术网

优化-在java中将std输入转换为整数数组

优化-在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

我想读取每一行输入,将数字存储在int[]数组中,进行一些计算,然后尽快进入下一行输入

输入(标准输入法)

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完成的速度,因此改进解析不会给你带来太多好处

说真的,除非您构建了整个系统,对其进行了分析,并发现效率低下的解析是阻止其达到性能目标的原因,否则不要这样做

但是严格地说,这只是一个练习,而且由于一般原则在其他地方可能有用,下面是一个如何直接从字符串解析它的示例

这些假设是:

  • 您将使用合理的编码,其中字符0..9是连续的
  • 流中唯一的字符将是0..9、减号和空格
  • 所有的数字都是格式正确的
  • 另一个重要的警告是,为了简单起见,我使用了
    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;
    }