假设我们有2个文件夹,每个文件夹中有1000个文件,我需要检查它们中使用的类似单词。高效比较数千个文件Java
虚拟的做法是
for(File f : folderA){
for(File g : folderB){
compare
}
}
但这不合理做很多比较和需要的内存和时间。我想知道有没有更好的方法来做到这一点?
假设我们有2个文件夹,每个文件夹中有1000个文件,我需要检查它们中使用的类似单词。高效比较数千个文件Java
虚拟的做法是
for(File f : folderA){
for(File g : folderB){
compare
}
}
但这不合理做很多比较和需要的内存和时间。我想知道有没有更好的方法来做到这一点?
只需使用地图。请注意,取决于您要比较的内容,相应地修改代码。
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);
}
}
您可以遍历地图并获取每个元素的值。每个地图元素的值表示您的集合中有多少个相似的项目。
要遍历图:
for (Map.Entry<File, Integer> entry : map.entrySet()) {
}
大(O)是用于该算法的线性,非常快。
谢谢杰森!这解决了它! – kenlz
取决于你想要做什么。
您可以创建一个Map
映射File
s到包含的不同单词集合,然后比较集合对。理想情况下,假设有常识数据,这比读取每一对文件花费的时间少得多。
或者,您可以将文字Map
包含它们的文件。那么,对于每个单词,你都会知道它是否出现在多个文件中。
正如我可能会增加,如果你检查的相似性,而不是相同的话,我建议你来计算doubleMetaphone看到所有相关的词https://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/language/DoubleMetaphone.html (删除文章像“这个”等)。
算法通常是内存使用和时间之间的折中。 –