2016-01-21 4 views
0

Скажем, у нас есть 2 папки, каждая из которых содержит 1000 файлов, и мне нужно проверить похожие слова, используемые в них.Сравнение тысяч файлов эффективно Java

фиктивный подход был бы

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

, но это было бы неразумно делать много сравнения, и занимает память и время. Интересно, есть ли лучшие способы сделать это?

+1

Алгоритмы обычно являются компромиссом между использованием памяти и временем. –

ответ

1

Просто используйте карту. Примечание. В зависимости от того, что вы пытаетесь сравнить, измените код соответствующим образом.

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()) { 

    } 

Big (O) является линейным для этого алгоритма, довольно быстро.

+0

Спасибо Джейсону! это решило это! – kenlz

4

В зависимости от того, что вы пытаетесь сделать.

Вы можете создать Map сопоставление File s с множеством различных содержащихся слов, а затем сравнить пары множеств. В идеале, и принимая данные здравого смысла, это займет гораздо меньше времени, чем чтение каждой пары файлов.

В качестве альтернативы, вы можете написать Map слов в файлах, содержащих их. Итак, для каждого слова вы узнаете, появляется ли оно в нескольких файлах.

Смежные вопросы