对 Java 中的一行上的多个整数使用 BufferedReader 而不是 Scanner Class 是最佳选择吗?

use*_*763 4 java time-complexity bufferedreader java.util.scanner

由于在用户输入值的情况下,缓冲阅读器比扫描仪类快得多,但是正如在大多数算法竞赛或采访中所观察到的那样,单个输入行上通常有多个整数。因此,使用 Scanner 类变得更容易 -

    Scanner in=new Scanner(System.in);
    int a=in.nextInt();
    int b=in.nextInt();
Run Code Online (Sandbox Code Playgroud)

如果是 Buffered Reader,您必须先输入一行(因为没有 readInt 选项),然后根据其上的整数数解析该行 -

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int a,b;
    String line = br.readLine(); 
    String[] strs = line.trim().split("\\s+");
    a=Integer.parseInt(strs[0]);
    b=Integer.parseInt(strs[1]);
Run Code Online (Sandbox Code Playgroud)

虽然在后一种情况下输入可能会更快,但是解析将获得的字符串分成单个整数会不会花费很多时间?因此,在这种情况下,以上哪一个更优化或更快?

谢谢你。

Gho*_*ica 5

非常错误的方法:您正在谈论用户输入。您如何处理在人类时间尺度上提供的东西绝对无关紧要。

人类以“秒”为单位进行操作,在某些情况下为“毫秒”。

而 Scanner 和 BufferedReader 之间在性能方面的差异可能在微秒的范围内,甚至可能在纳秒的范围内。

即使我们不谈论人类在控制台上输入内容(而是使用管道,例如cat somefile | java Whatever) - 您仍然会大规模发生IO。您的应用程序将花费 99.99% 的时间等待 IO 发生。最后如何处理传入的字符串并不重要。

换句话说:你最好把时间花在编写干净的代码上,以一种易于被人类读者理解的直接方式完成工作。然后让 JIT 发挥它的魔力。

由于问题特别是关于处理“基于文件”的输入 -自己去配置文件。我会在这里做什么:

  • 创建一个抽象层,让我可以轻松地在不同的实现之间切换
  • 然后我将开始对不同的解决方案进行基准测试(请仔细阅读本文以准备此类活动)

你看,最后两段代码会做非常相似的事情。扫描仪仍在处理某些事情,您必须深入研究相应的源代码一段时间才能了解扫描仪解析和 BufferedReader 读取 + 手动解析之间的潜在差异。