0

我正在为我的搜索引擎构建一个倒排索引文件。我已经编写了这个类,但是当我尝试测试它时,程序卡在这部分:

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 循环中。我可能已经太累了,希望没有看到小错误......有人可以给我他们对这段代码的意见吗?

4

1 回答 1

0

不确定有问题的循环打算做什么,因为您似乎正在检查 url作为参数传入的参数是否存在于HashObject当前迭代的列表中,如果在列表中找不到,则HashObject在列表中插入一个新的它的url值作为传入的值url。如果没有一个现有HashObject的 s 与传入的 s 具有相同的值url,那么您将HashObject在列表中插入多个具有相同值的 s titleterm等等url

如果这确实是您需要的,那么ListIterator在遍历列表时使用 for 添加。你可以阅读更多关于add方法的信息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 插入一个新的。在这种情况下,上面的代码将不得不更改。

于 2014-04-18T20:44:56.457 回答