我需要从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”
最终需要一段时间。我需要的最终格式是每个单词的字符串数组。
答案 0 :(得分:2)
temp += s1.nextLine() + "\n"
花费很长时间的原因是你生成了很多字符串。实际上,对于读取的N个字符,您将生成O(N)个大字符串,并复制O(N ^ 2)个字符。
(仅)附加到StringBuilder
而不是使用String
连接的解决方案。但是,这不是真正的解决方案,因为temp
字符串不是您的最终目标。你的最终目标是创造一系列文字。
你真正需要做的是将每一行分成单词,然后积累单词。但是将它们直接累积到一个数组中会很有效...因为数组不能扩展。所以我建议您执行以下操作:
ArrayList<String>
来保存所有单词List.toArray
生成最终的单词数组......或者只是将单词留在列表中,如果更合适的话。我需要的最终格式是每个单词的字符串数组。
我在上面读到这个意思是你想要一个文件中所有单词的列表。如果文件中出现多次单词,则该单词应在列表中多次出现。
另一方面,如果您想要文件中不同字词的列表,那么您应该使用Set
而不是List
来累积字词。根据您要对下一个字词执行的操作,HashSet
,TreeSet
或LinkedHashSet
是合适的。
答案 1 :(得分:0)
你感兴趣的是每个单词吗?还是每一行? 此外,您希望数组包含每个单词的字符串或每行的字符串..? 无论哪种方式,正如斯蒂芬所说,ArrayList是一种更好的方法。
你可以:
ArrayList<String> list = new ArrayList<>();
// each line as a string..
while (yourScanner.hasNextLine())
{
list.add(yourScanner.nextLine());
}
// each word as a string..
while (yourScanner.hasNext())
{
list.add(yourScanner.next());
}
字符串连接可能很昂贵,特别是在使用'temp'变量解决方案时达到200,00个单词......