【问题标题】:Removing duplicates from a file从文件中删除重复项
【发布时间】:2015-02-24 16:32:35
【问题描述】:

我有一个文本文件。我想制作一组 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 版本?
  • 是的。 a 中的总行数总是偶数。 1.6 java版
  • 1.6?严重地?嘿,这是 2015 年;你不能至少使用1.7吗?如果没有,您至少可以使用外部库吗?
  • 是否保证日期始终匹配?

标签: java text-parsing


【解决方案1】:

由于你真正拥有的是两行,而不是一行,所以事情比简单地逐行阅读并只修剪重复的内容要复杂一些。

这是使用 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,我建议您使用 Guava 及其 Closer 来管理您的 I/O 资源。

【讨论】:

  • 让我试试这个解决方案。
【解决方案2】:

取决于日期是否始终保证相同:

  • 如果是,则将所有行作为复合值添加到 LinkedHashSet 中,
  • 如果否,则可能使用Map 将值映射到日期。

【讨论】:

    【解决方案3】:

    只需将每一行放入集合中,然后将集合的内容写入文件。 (是的 LinkedHashSet 实现以保留顺序)

    【讨论】:

    • 将其放入 Set 可能会改变行的顺序。
    • 他已经知道使用LinkedHashSet所以不要改变顺序。
    • 如果他已经知道他必须使用 LinkedHashSet,那么你的回答有什么意义?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    相关资源
    最近更新 更多