使用Java删除文件中的重复行
作为我正在做的项目的一部分,我想清理我生成的重复行条目的文件。但是,这些重复项通常不会彼此靠近发生。我想出了一种用Java执行此操作的方法(基本上是复制文件,然后使用嵌套的while语句将一个文件中的每一行与其他文件中的每一行进行比较)。问题是我生成的文件很大而且文本很重(大约22.5万行文本,大约40兆)。我估计目前的程序需要63个小时!这绝对是不可接受的。
但是,我需要一个集成的解决方案。最好用Java。有任何想法吗?谢谢!
回答:
嗯… 40兆似乎足够小,您可以建立一个Set
线条,然后全部打印出来。这将比O(n 2)I / O工作更快。
就像这样(忽略异常):
public void stripDuplicatesFromFile(String filename) { BufferedReader reader = new BufferedReader(new FileReader(filename));
Set<String> lines = new HashSet<String>(10000); // maybe should be bigger
String line;
while ((line = reader.readLine()) != null) {
lines.add(line);
}
reader.close();
BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
for (String unique : lines) {
writer.write(unique);
writer.newLine();
}
writer.close();
}
如果顺序很重要,则可以使用LinkedHashSet
而不是HashSet
。由于元素是通过引用存储的,因此与实际数据量相比,额外链表的开销应该微不足道。
正如Workshop
Alex指出的那样,如果您不介意制作临时文件,则只需在阅读时打印出来即可。这使您可以使用HashSet
而不是LinkedHashSet
。但是我怀疑您会注意到这样的I
/ O绑定操作的区别。
以上是 使用Java删除文件中的重复行 的全部内容, 来源链接: utcz.com/qa/402537.html