Список объектов внутри проблемы 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
тогда вы будете вставлять несколько HashObject
s в списке с тем же значением для 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));
}
}
Но, может быть, обнаружив, что ни один из ваших HashObject
s в списке передается в URL, вы хотите вставить новый HashObject
с этим URL только один раз. В этом случае приведенный выше код придется изменить.