簡體   English   中英

HashMap問題中的對象列表

[英]List of objects inside a HashMap issue

我正在為搜索引擎構建一個反向索引文件。 但是,我已經編寫了該類,當我嘗試對其進行測試時,程序陷入了這一部分:

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循環中。 我可能已經太累了,希望看不到一些小錯誤。有人可以就此代碼發表意見嗎?

不確定要執行的問題循環是什么,因為您似乎正在檢查作為參數傳入的url是否存在於列表中當前迭代的HashObject中,如果未在其中找到,請在其中插入新的HashObject 。其url值與傳入url url值相同的列表。 如果現有的HashObject具有與傳入的url相同的值,那么您將在列表中將多個HashObject ,並且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));
    }
}

但是,也許發現列表中的HashObject都沒有傳入的url時,您只想用該url插入一個新的HashObject一次。 在這種情況下,上面的代碼將不得不更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM