假設我們有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 (刪除文章像「這個」等)。
算法通常是內存使用和時間之間的折中。 –