有效比较数千个文件 Java

Compare thousand of files efficiently Java

假设我们有 2 个文件夹,每个文件夹中有 1000 个文件,我需要检查它们中使用的相似词。

虚拟方法是

for(File f : folderA){
    for(File g : folderB){
        compare
    }
}

但是这样做很多比较是不合理的,而且需要内存和时间。我想知道有没有更好的方法来做到这一点?

取决于您要做什么。

您可以创建一个 Map 映射 Files 到包含的不同单词的集合,然后比较成对的集合。理想情况下,假设常识性数据,这将比读取每对文件花费的时间少得多。

或者,您可以对包含它们的文件使用 Map 个单词。那么,对于每个单词,您就会知道它是否出现在多个文件中。

就用地图吧。请注意,取决于您要比较的内容,相应地修改代码。

Map<File,Integer> map = new HashMap<>();
for(File f : folderA){
    Integer count = 0;
    if(map.get(f)==null){
        map.put(f,1);
    }else{
        count = map.get(f);
        map.put(f,++count);
    }
}

您可以遍历地图并获取每个元素的值。每个地图元素的值,表示您的 collection.

中有多少相似项目

要遍历地图:

    for (Map.Entry<File, Integer> entry : map.entrySet()) {

    }

这个算法的 Big(O) 是线性的,相当快。

正如我要补充的,如果您要检查相似性,而不是相同的词,我建议您计算 doubleMetaphone 参见 https://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/language/DoubleMetaphone.html 所有相关词(删除像 "the, this" 等文章)。