有没有办法使用 Java 检查文件中的重复行?

Is there a way to check for duplicate lines within a file using Java?

提问人:Bianca 提问时间:9/8/2020 最后编辑:Bianca 更新时间:4/5/2021 访问量:798

问:

我正在尝试读取 .inp 文件中的每一行,对于每个非重复项,将该行写入一个新文件。到目前为止,我在使用代码时遇到的问题是所有行都写入输出文件中,无论它们是否与前一行重复。我使用 Scanner 对象读取文件,使用 BufferedReader/FileWriter 对象写入输出文件。

如何避免重复写入?

String book = reader.nextLine();
boolean duplicate = false;

while (reader.hasNext() == true) {
    try {
        duplicate = reader.hasNext(book);

        if (duplicate == true) {
            book = reader.nextLine();
        } else {
            writer.write(book + "\n");
            book = reader.nextLine();
        }
    } catch (NoSuchElementException ex) {
        break;
    }
}
Java 文件 复制 IOSTREAM 编写器

评论

0赞 Maxim Firsoff 9/8/2020
您可以将每个字符串的哈希 (System.identityHashCode(string)) 存储在 Set 中(但不要忘记内存限制,此解决方案适用于 1000 个字符串,但不确定它是否适用于 1 000 000 个字符串)。
0赞 Abra 9/8/2020
你是说重复的行一起出现在文件中吗?例如,第 96 行不能是第 70 行的重复项吗?另外,您可以编辑您的问题并发布文件中的一些示例行吗?顺便问一下,文件中有多少行?

答:

1赞 Robby Cornelissen 9/8/2020 #1

视情况而定:

  • 如果重复的行是连续的,请维护一个变量来存储前一行并与之进行比较。
  • 如果重复的行不是连续的,并且有相对较少的 (*) 短行,请将您已经处理过的行存储在 a 中,并在处理行时检查该行是否已经设置了行。HashSetcontains()
  • 如果重复的行不是连续的,并且有相对较少很长的行,而不是将完整的行存储在 a 中,存储每行的哈希值(例如 SHA1),并与之进行比较。HashSet
  • 如果重复的行不是连续的,并且有很多长行,请将上述技术与某种形式的持久性数据库或数据存储相结合。

(*)相对于可用内存