Mon*_*ter 25 java file-io text file duplicates
作为我正在进行的项目的一部分,我想清理一个我生成重复行条目的文件.然而,这些重复通常不会彼此靠近.我想出了一种在Java中这样做的方法(它基本上制作了文件的副本,然后使用嵌套的while语句将一个文件中的每一行与另一个文件中的其余部分进行比较).问题是,我生成的文件非常大而且文本很重(大约225k行文本,大约40兆).我估计我目前的流程需要63个小时!这绝对是不可接受的.
但是,我需要一个集成的解决方案.最好是Java.有任何想法吗?谢谢!
Mic*_*ers 37
嗯... 40 megs似乎足够小,你可以建立一条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();
}
Run Code Online (Sandbox Code Playgroud)
如果订单很重要,您可以使用a LinkedHashSet
而不是a HashSet
.由于元素是通过引用存储的,因此与实际数据量相比,额外链接列表的开销应该是无关紧要的.
编辑:正如工作室Alex指出的那样,如果你不介意制作一个临时文件,你可以在阅读时简单地打印出来.这允许您使用简单HashSet
而不是LinkedHashSet
.但我怀疑你是否注意到像这样的I/O绑定操作的区别.
Wim*_*ink 15
好吧,大多数答案都有点愚蠢和缓慢,因为它涉及到一些hashset或其他任何东西添加行,然后再从那个集合中移回它.让我展示伪代码中最优的解决方案:
Create a hashset for just strings.
Open the input file.
Open the output file.
while not EOF(input)
Read Line.
If not(Line in hashSet)
Add Line to hashset.
Write Line to output.
End If.
End While.
Free hashset.
Close input.
Close output.
Run Code Online (Sandbox Code Playgroud)
请伙计们,不要让它变得比它需要的更难.:-)甚至不打扰排序,你不需要.
Pet*_*rey 10
类似的方法
public void stripDuplicatesFromFile(String filename) {
IOUtils.writeLines(
new LinkedHashSet<String>(IOUtils.readLines(new FileInputStream(filename)),
"\n", new FileOutputStream(filename + ".uniq"));
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
42369 次 |
最近记录: |