HashMap问题中的对象列表

时间:2014-04-18 19:55:03

标签: java list hashmap concurrenthashmap inverted-index

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

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

1 个答案:

答案 0 :(得分:0)

不确定问题循环的目的是什么,因为您似乎正在检查作为参数传入的url是否存在于当前迭代的HashObject列表中,并且如果在那里找不到,请在列表中插入一个新HashObject,其url值与传入url的值相同。如果现有HashObject中没有一个与url中传递的值相同,那么您将使用HashObject的相同值检查列表中的多个titletermurl等。

如果确实如此,那么在迭代列表时使用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。在这种情况下,上面的代码将不得不改变。