删除文件中的重复项
问题描述:
我有一个文本文件。我想制作一组4行,并检查这4行是否是唯一的。如果它们是唯一的,则将其复制到另一个文本文件删除文件中的重复项
file.txt的包含:
abc
12:12:11
john
12/25/2014
abc
12:12:11
doe
12/25/2014
abc
12:12:11
john
12/25/2014
新的TXT文件应仅显示。
abc
12:12:11
john
12/25/2014
abc
12:12:11
doe
12/25/2014
and delete
abc
12:12:11
john
12/25/2014
有什么办法可以在Java中做到这一点?我无法弄清楚如何使用LinkedHashSet来获得结果。
答
因为你真正拥有的是两行的集合,而不是一个,所以这个问题比简单地逐一阅读行并且只修剪重复项要复杂一点。
下面是使用Java 7的一个解决方案:
public static void eliminateDups(final String srcfile, final String dstfile)
throws IOException
{
final StringBuilder sb = new StringBuilder();
final Set<String> seen = new HashSet<>();
final Charset charset = StandardCharsets.UTF_8;
final Path src = Paths.get(srcfile);
final Path dst = Paths.get(dstfile);
try (
final BufferedReader reader = Files.newBufferedReader(src, charset);
final BufferedWriter writer = Files.newBufferedWriter(dst, charset,
StandardOpenOption.TRUNCATE_EXISTING);
) {
String line1, line2;
while ((line1 = reader.readLine()) != null) {
line2 = reader.readLine();
sb.setLength(0);
if (!seen.add(sb.append(line1).append(line2).toString()))
continue;
writer.write(line1);
writer.newLine();
writer.write(line2);
writer.newLine();
}
}
}
对于Java 6,我建议你使用番石榴和其Closer
来管理您的I/O资源。
+0
让我试试这个解决方案。 – 2015-02-24 16:54:36
+0
那么,如果你使用Java 6,它将无法工作......你可以使用番石榴? – fge 2015-02-24 16:55:05
答
取决于日期是否始终保证是相同的:
- 如果是,再加入所有的线到LinkedHashSet作为一个复合值,
- 如果不是,那么可能使用
Map
从值映射到日期。
那些是你在这里有两行的集合。是否保证文件中的行数始终为偶数? – fge 2015-02-24 16:36:52
另外,哪个Java版本是? – fge 2015-02-24 16:38:02
是的。 a中的总行数将始终为偶数。 1.6 java版 – 2015-02-24 16:41:33