2

所以我有一个文件要读入,我知道数据将如何设置。例如,我知道每个新行的第一个标记将是双精度。

我一直在使用 Scanner 并且只是使用 scan.nextDouble() 来读取双精度,但是我被告知 Double.parseDouble(scan.next()) 反而加快了从文件中读取数据的过程30 秒到约 5 秒。

scan.nextInt() 与 Integer.parseInt(scan.next()) 也是如此。

在我正在阅读的文件中,每行大约有 40,000 行 int double int int 。

那么是什么让它变得如此之快呢?

4

2 回答 2

5

这都是因为 scan.nextDouble() 从下面的 Stream 中找到最近的 Doublelike 值。它不能确定下一个字符串值将是一个 doublelike 值,例如

s = "abcde1234.5" scan.nextDouble(s) 将是 1234.5 但 Double.parseDouble(scan.next()) 会抛出错误。

您将在源代码中找到更多详细信息。

于 2012-08-12T01:35:14.490 回答
5

除了简单地读入下一个标记并调用适当的解析器之外,Scannernext<Type>方法还在做额外的工作。首先,他们检查一个正则表达式,该令牌对该类型有效,然后他们处理它以处理特定于语言环境的位(例如组分隔符、小数分隔符等),然后最后将其传递给解析器。

如果您确定您的输入与您描述的格式完全相同,并且您不需要考虑由来自不同区域设置的输入等引起的任何潜在差异,那么请务必使用您被告知的优化.

于 2012-08-12T01:43:50.960 回答