Java HashMap问题中的对象列表

Java HashMap问题中的对象列表,java,list,hashmap,concurrenthashmap,inverted-index,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,

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

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);
        }
    }
}
/*
*类名:InvertedFile
*版本:1.1
*日期:2014年4月15日
*版权归Mateusz Michalski所有
*描述:此类实现了一个用于存储爬网结果的反向生成器。
*/
包搜索引擎;
导入java.util.*;
导入java.util.concurrent.ConcurrentHashMap;
公共级逆变器文件
{
ConcurrentHashMap myMap=新的ConcurrentHashMap();
公共静态int docCollection=0;
SearchEngine SearchEngine=新搜索引擎();
公共void insertValues(字符串标题、字符串术语、字符串url)
{
如果(!myMap.containsKey(术语)){
列表=新的ArrayList();
添加(新的HashObject(标题、术语、url、1、1));
myMap.put(术语、列表);
}
if(myMap.containsKey(term)){
List=myMap.get(术语);
对于(最终HashObject值:list){
if(url.equals(value.getUrl()))
value.setFrequency();
如果(!url.equals(value.getUrl()){
添加(新的HashObject(标题、术语、url、1、1));
//for(HashObject val:itemList)
//val.setDoc();
}
}              
myMap.put(术语、列表);
}
}
}

我不知道为什么它会卡在那个for循环中。我可能已经太累了,希望没有看到一个小错误。。。有人能告诉我他们对此代码的看法吗?

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

如果这确实是您所需要的,那么在遍历列表时使用
ListIterator
进行添加。您可以阅读有关
listierator
方法的更多信息

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,您可能希望只插入一次带有该url的新
HashObject
。在这种情况下,上面的代码将不得不更改。

您希望它同时工作吗?目前不会,不会。我认为这是因为您在迭代
列表时在结构上修改了它。如果使用经典迭代器,建议通过
迭代器的
add
remove
方法添加/删除。看见我认为对于增强的for循环也是如此,但我(还)找不到文档;如果在迭代过程中以任何其他方式修改基础集合,则该行为未指定。我认为它也适用于添加。很好,谢谢Nivas。