【问题标题】:compare 2 arrays and remove duplicates ? Java比较 2 个数组并删除重复项?爪哇
【发布时间】:2013-07-19 07:35:57
【问题描述】:

所以我试图比较 java 中的 2 个巨大的文本列表。文本可能如下所示:

list1 : 值 1 , 值 2 , 值 3 ... list2 : 值 1604 , 值 7000 , 值 1 ...

关键是我喜欢从列表 1 与列表 2 中的每一行进行比较(每个值都在自己的行中)并从列表 2 中删除重复项,将数组 3 写入文件。这就是我得到的:

编辑:

    File haveFile = new File("Combine Without Dups.txt");
    BufferedReader br = null;
    br = new BufferedReader(new FileReader(haveFile));
    String line ;
    String list = null ;

    while ((line = br.readLine()) != null) {

    list = line ;

    }

    File compareFile = new File("database.txt");
    BufferedReader br2 = null;
    br2 = new BufferedReader(new FileReader(compareFile));
    String line2 ;
    String list2 = null ;

    while ((line2 = br2.readLine()) != null) {

    list2 = line2 ;

    list2.removeAll(list);

【问题讨论】:

  • 每个列表的值是否唯一?比如,一个列表可以有两个等价的值吗?
  • 你可以使用 HashSet 代替 ArrayList,重复被自动删除
  • 为什么这样做:BufferedReader br = null; br = new BufferedReader(new FileReader(haveFile)); ?
  • 是的,它们是独一无二的。列表 1 包含 12000 个名称,每行一个名称。列表 2 包含 42000 个名称,我需要删除这 12000 个名称
  • @kon 它是我知道如何阅读的唯一方法,并且到目前为止它有效。我不需要它是完美的,只要完成工作就可以了

标签: java arrays compare


【解决方案1】:

将第一个文件中的所有行读入Set<String>(不是List),同样从第二个文件中读取。例如使用LinkedHashSets(保留插入顺序)。

然后做:

// set2 contains lines in second file, set1 in first file
set2.removeAll(set1);

然后将set2的内容写入结果文件中。

请注意,这是假设没有重复值。

如果您使用 Guava,您还可以使用 Sets.difference() 来计算集合之间的差异,并使用 Files.readLines() 直接从文件中读取行(注意,这不是 Java 7 的 Files - 如果您这样做使用 Java 7,您可以使用 Files.readAllLines() -- 并将 File 扔出窗外以获得良好的衡量标准)


使用 Java 7 的完整代码:

final Path path1 = Paths.get("/path/to/file1");
final Path path2 = Paths.get("/path/to/file2");
final Path outfile = Paths.get("/path/to/outfile");

final List<String> list1 = Files.readAllLines(path1, StandardCharsets.UTF_8);
final List<String> list2 = Files.readAllLines(path2, StandardCharsets.UTF_8);

list2.removeAll(list1);

Files.write(outfile, list2, StandardCharsets.UTF_8);

【讨论】:

  • 我希望我提取的第三个文件是单独一行中的每个单词,并且格式与其他 2 相同。只是没有 12000 条特定的行。不确定创建一个字符串会给我相同格式的名称吗?
  • @anno 我不明白你所说的“与其他 2 相同的格式”是什么意思。当然它会以相同的格式写入。
  • 我的意思是文件 3 将有大约 30000 个名称,每个名称都在自己的行中,而不是一个接一个
  • 这不是问题。 FileWriter.newLine(),只要在你写的每个名字后写一个换行符
  • 不确定如何使用 removeAll 表示该方法未定义。 (我在win7 64位上使用java eclipse)
【解决方案2】:

如果您的意思是合并 list1+list2 然后删除重复项 使用普通的 Set 集合,因为它不包含重复项,当您添加值时,它会自动删除重复项,

【讨论】:

  • 不,我想从文件 2 中删除文件 1 中的每个名称。没有结合。
  • 好的,然后一个 for 循环解决了问题 for(int i=0; i
  • 好的,我想我明白了,但似乎我无法使用 FileWriter 写入文件数组。
  • FileWriter fw = new FileWriter(filename,true); fw.write(list3); fw.write(System.getProperty("line.separator")); fw.close();
  • Acually 我不说我需要转换 .get .whatever 这意味着我不知道
【解决方案3】:

1.将2个文件读入2个ArrayList 2.创建2个for循环,其中一个在另一个内部。第一个循环应该在第一个列表中迭代,第二个循环应该在第二个列表中迭代。 3.比较list 1和list 2的每个值。如果有相等的值,将其删除。

【讨论】:

  • 这就是我想要的!我需要时间编码,因为我是菜鸟!
猜你喜欢
  • 2017-12-31
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 2013-02-02
  • 1970-01-01
  • 2014-12-16
相关资源
最近更新 更多