我需要从 java 读取一个包含 500,000 多行的文件,我想知道与我的代码相比是否有办法加快该过程:
Scanner s1 = new Scanner(new FileInputStream(args[0]));
while(s1.hasNextLine()) {
temp += s1.nextLine() + "\n";
}
data = temp.split("\\s+");
开始时还好,但超过 200000 行后
temp += s1.nextLine() + "\n"
最终确实需要一段时间。我需要的最终格式是每个单词的字符串数组。
最佳答案
temp += s1.nextLine() + "\n"
的原因花费很长时间是因为您正在生成大量字符串。事实上,对于读取的 N 个字符,您将生成 O(N) 个大字符串,并复制 O(N^2) 个字符。
解决方案(只是)是附加到 StringBuilder
而不是使用String
级联。然而,这并不是真正的解决方案,因为 temp
字符串不是你的最终目标。您的最终目标是创建一系列单词。
您真正需要做的是将每一行拆分为单词,然后累积单词。但是将它们直接累加到数组中效果不佳......因为数组无法扩展。因此,我建议您执行以下操作:
- 创建
ArrayList<String>
容纳所有单词 - 读取每一行并将其拆分为单词数组
- 将数组中的单词附加到所有单词的列表中
- 完成后,请使用
List.toArray
生成最终的单词数组...或者将单词保留在列表中(如果更合适的话)。
The final format I need is a string array of every word.
我将上面的内容理解为您想要文件中所有单词的列表。如果某个单词在文件中多次出现,它也应该在列表中出现多次。
另一方面,如果您想要文件中不同单词的列表,那么您应该使用 Set
而不是List
来积累单词。根据您想要对接下来的单词执行的操作,HashSet
, TreeSet
或LinkedHashSet
是合适的。
关于java - 快速将文件读入字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24297874/