有效比较数千个文件 Java
Compare thousand of files efficiently Java
假设我们有 2 个文件夹,每个文件夹中有 1000 个文件,我需要检查它们中使用的相似词。
虚拟方法是
for(File f : folderA){
for(File g : folderB){
compare
}
}
但是这样做很多比较是不合理的,而且需要内存和时间。我想知道有没有更好的方法来做到这一点?
取决于您要做什么。
您可以创建一个 Map
映射 File
s 到包含的不同单词的集合,然后比较成对的集合。理想情况下,假设常识性数据,这将比读取每对文件花费的时间少得多。
或者,您可以对包含它们的文件使用 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" 等文章)。
假设我们有 2 个文件夹,每个文件夹中有 1000 个文件,我需要检查它们中使用的相似词。
虚拟方法是
for(File f : folderA){
for(File g : folderB){
compare
}
}
但是这样做很多比较是不合理的,而且需要内存和时间。我想知道有没有更好的方法来做到这一点?
取决于您要做什么。
您可以创建一个 Map
映射 File
s 到包含的不同单词的集合,然后比较成对的集合。理想情况下,假设常识性数据,这将比读取每对文件花费的时间少得多。
或者,您可以对包含它们的文件使用 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" 等文章)。