在一行中更快地实现多个输入(Java)

在一行中更快地实现多个输入(Java),java,input,Java,Input,这可能是个愚蠢的问题 我只是想更快地解决以下问题 我想在一行中输入三个整数,例如: 10 34 54 一种方法是创建一个BufferedReader,然后使用readLine() 它将把整行读作一个字符串 然后我们可以使用StringTokenizer来分隔三个整数。(缓慢执行) 另一种方法是使用“Scanner”并通过nextInt()方法获取输入。(比以前的方法慢) 我想要一个快速的实现来接受这种类型的输入,因为我必须读取超过2000000行,而且这些实现非常慢 我的实施: Buffere

这可能是个愚蠢的问题

我只是想更快地解决以下问题

我想在一行中输入三个整数,例如:

10 34 54
一种方法是创建一个BufferedReader,然后使用readLine() 它将把整行读作一个字符串 然后我们可以使用StringTokenizer来分隔三个整数。(缓慢执行)

另一种方法是使用“Scanner”并通过nextInt()方法获取输入。(比以前的方法慢)

我想要一个快速的实现来接受这种类型的输入,因为我必须读取超过2000000行,而且这些实现非常慢

我的实施:

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

for(i=0;i<n;i++) {
    str=br.readLine();
    st = new StringTokenizer(str);
    t1=Integer.parseInt(st.nextElement().toString());
    t2=Integer.parseInt(st.nextElement().toString());
    z=Long.parseLong(st.nextElement().toString());
}
BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in));

对于(i=0;i,这里有一个非常快速的基本示例:

public static void main(String[] args) throws IOException {
    BufferedReader reader = new BufferedReader(new FileReader("myfile.txt"));
    String line;
    while ((line = reader.readLine()) != null) {
        for (String s : line.split(" ")) {
            final int i = Integer.parseInt(s);
            // do something with i...
        }
    }
    reader.close();
}
然而,你的任务基本上需要时间

如果你在一个网站上这样做,并达到超时,你应该考虑在后台线程中进行,并向用户发送一个响应,说明数据正在被处理。你可能需要为用户添加一个检查进度的方式。 我只是想更快地解决以下问题

很可能你不需要更快的实现。说真的。即使是一个200万行的输入文件

机会在于:

  • 处理文件的时间比读取文件的时间多,并且
  • 大多数“读取时间”都花在操作系统级别上,或者只是等待下一个磁盘块被读取
我的建议是不要麻烦优化这个,除非整个应用程序运行时间太长。如果发现这种情况,请对应用程序进行概要分析,并使用概要统计数据告诉您哪些地方值得在优化上花费精力


(我的直觉是,优化应用程序的这一部分并没有什么好处。但不要依赖于此。对其进行分析!)

以下是我所说的“专用扫描仪”的意思。根据解析器(或拆分器)的效率,这可能会快一点(可能不是):

BufferedReader br=新的BufferedReader(…);

对于(i=0;iHow slow?您可以发布一些您使用的示例代码以及计时吗?您可以使用BufferedReader并进行自己的解析,专门收集N个字符,直到看到空白或字符串结尾。这可能会更快。请注意,使用BufferedReader和更大的缓冲区,在所有情况下都可以获得更好的性能(10kB已经很有帮助了)。@SteveMcLeod我在一个编程网站上使用了这种方法,并且超过了时间限制。所以我认为有更好的方法来做。读取>200k的文本行并解析其中的三个整数总是不太理想。最好只做一次,然后存储一个二进制文件(流?)数据的版本,下次使用。@TheBlatone你能提供一个示例实现吗?我想你弄错了。每行包含三个整数。我会试试这个。但我认为它将提供与StringTokenizer相似的时间。通过编程网站,我指的是编程竞争(类似于TopCoder)@Android lol…来吧,发布你的代码和计时结果,我们会看看我们能为你做些什么。其他一切对我们来说都是一种冒险,是浪费时间。此外,Integer.parseInt将很难被更高效、更可读的东西取代。这可能是一个“字符串到数字的转换并不简单,而且需要相当长的时间”低估。即,可能是字符串拆分(或扫描仪使用)不是这里最大的性能差距。
BufferedReader br=new BufferedReader(...);  
for(i=0;i<n;i++) 
{     
    String str=br.readLine();
    long[] resultLongs = {-1,-1,-1};
    int startPos=0;
    int nextLongIndex=0;
    for (int p=0;p<str.length();p++)
    {
        if (str.charAt(p)== ' ')
        {
            String intAsStr=str.substring(startPos, p-1);
            resultLongs[nextLongIndex++]=Integer.parseInt(intAsStr);
            startpos=p+1;
        }
    }
    // t1, t2 and z are in resultLongs[0] through resultLongs[2]     
    }