Список объектов внутри проблемы HashMap

Я создаю инвертированный индексный файл для своей поисковой системы. Однако я написал класс, когда я пытаюсь его протестировать, программа застревает в этой части:

for (final HashObject value: list) {

   if(url.equals(value.getUrl()))
       value.setFrequency();

   if(!url.equals(value.getUrl())){       
       list.add(new HashObject(title, term, url, 1, 1));           
   }
}

Всякий раз, когда я удаляю блок кода, размещенный выше, вся поисковая система продолжает сканировать правильно. Кажется, что он застревает, так как программа не предпринимает никаких дальнейших действий... Вы можете увидеть весь код здесь:

/*
 * Classname: InvertedFile
 * Version: 1.1
 * Date: 15/04/2014
 * Copyright by Mateusz Michalski

 * Description: This class implements an inverted builder for storing results of crawling.
 */

package searchengine;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

public class InvertedFile
{
    ConcurrentHashMap<String, List<HashObject>> myMap = new ConcurrentHashMap<>();
    public static int docCollection = 0;

    SearchEngine searchEngine = new SearchEngine();

    public void insertValues(String title, String term, String url)
    {
        if (!myMap.containsKey(term)){
            List<HashObject> list = new ArrayList<>();
            list.add(new HashObject(title, term, url, 1, 1));
            myMap.put(term, list);
        }

        if(myMap.containsKey(term)){            
            List<HashObject> list = myMap.get(term);

            for (final HashObject value: list) {          
                 if(url.equals(value.getUrl()))
                     value.setFrequency();

                if(!url.equals(value.getUrl())){          
                    list.add(new HashObject(title, term, url, 1, 1));

                //for (HashObject val: itemList)
                    //val.setDoc();
                }
            }              
            myMap.put(term, list);
        }
    }
}

Я понятия не имею, почему это застревает в этом для цикла. Возможно, я уже слишком устал и, надеюсь, не увижу мелких ошибок... Кто-нибудь может высказать свое мнение по этому коду?

1 ответ

Решение

Не уверен, для чего предназначен проблемный цикл, так как кажется, что вы проверяете url передается в качестве параметра, чтобы существовать в HashObject текущей итерации по списку, и если там не найдено, вставьте новую HashObject в списке, который имеет свои url значение как значение переданного в url, Если ни один из существующих HashObjectимеют то же значение, что и переданные в urlтогда вы будете вставлять несколько HashObjects в списке с тем же значением для title, term, url и т.п.

Если это действительно то, что вам нужно, используйте ListIterator для добавления при переборе списка. Вы можете прочитать больше о методе добавления ListIterator,

ListIterator listIter = list.listIterator();
while (listIter.hasNext()) { 
    HashObject value = listIter.next();       
    if(url.equals(value.getUrl())){
        value.setFrequency();
    }

    if(!url.equals(value.getUrl())){          
        listIter.add(new HashObject(title, term, url, 1, 1));
    }
}

Но, может быть, обнаружив, что ни один из ваших HashObjects в списке передается в URL, вы хотите вставить новый HashObject с этим URL только один раз. В этом случае приведенный выше код придется изменить.

Другие вопросы по тегам