我正在为我的搜索引擎构建一个倒排索引文件。我编写了这个类,但是当我尝试测试它时,程序就陷入了这个部分:
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);
}
}
}
我不知道为什么它会陷入for循环中。我可能已经太累了,希望没有看到一些小错误......有人能就这段代码给我他们的看法吗?
答案 0 :(得分:0)
不确定问题循环的目的是什么,因为您似乎正在检查作为参数传入的url
是否存在于当前迭代的HashObject
列表中,并且如果在那里找不到,请在列表中插入一个新HashObject
,其url
值与传入url
的值相同。如果现有HashObject
中没有一个与url
中传递的值相同,那么您将使用HashObject
的相同值检查列表中的多个title
,term
,url
等。
如果确实如此,那么在迭代列表时使用ListIterator
进行添加。您可以详细了解ListIterator
的{{3}}方法。
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
没有传入的网址时,您希望仅使用该网址插入一个新的HashObject
。在这种情况下,上面的代码将不得不改变。