【问题标题】:List of objects inside a HashMap issueHashMap 问题中的对象列表
【发布时间】:2014-04-18 19:55:02
【问题描述】:

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

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

【问题讨论】:

  • 您希望它同时工作吗?
  • 暂时没有,没有。
  • 我认为这是因为您在迭代 list 时对其进行了结构性修改。如果您使用经典迭代器,推荐的方法是通过Iteratoraddremove 方法添加/删除。见here。我认为这也适用于增强的 for 循环,但我(还)无法找到文档。
  • Java tutorialsiterator.remove 是在迭代期间修改集合的唯一安全方法;如果在迭代过程中以任何其他方式修改了基础集合,则行为未指定。我认为它也适用于add
  • 很好,谢谢 Nivas。

标签: java list hashmap concurrenthashmap inverted-index


【解决方案1】:

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

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

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));
    }
}

但也许当您发现列表中的HashObjects 都没有传入的url 时,您只想用该url 插入一个新的HashObject 一次。在这种情况下,上面的代码将不得不更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-12
    • 2020-07-11
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    相关资源
    最近更新 更多