更新HashMap中的ArrayList

3
我需要创建几个文档的单词索引。 索引的格式如下:
单词,{d1,f1,d2,f2 ...},值
单词 = 几个文档中的单词
d1,d2,.. = 出现该单词的文档名称
f1,f2... = 单词在该文档中出现的次数
值=基于单词出现文件数的某种计算
到目前为止,我已经创建了两个类。IRSystems和ReferenceCount。
ReferenceCount具有documentId(d1,d2 ..)和Count(f1,f2 ..)
IRSystems具有ReferenceCount的arraylist和Hashmap [String,arraylist(ReferenceCount)] 我一次从一个文档中读取所有单词,并将其命名为“ tokens” 我试图以这样的方式将单词添加到HashMap中:如果该单词已经存在于HashMap中,则查找该单词所属的文档,如果它来自同一文档,则更新计数。如果是来自不同文档,则将新的documentId和新的count添加到arrayList中。
到目前为止我已经做到了这一点。 我有两个问题:如果该单词来自同一文档,则不会增加单词的数量,并且我无法实现“ value”。
HashMap<String, ArrayList<ReferenceCount>> normalList = new HashMap<String, ArrayList<ReferenceCount>>(); 

while (st.hasMoreElements()) 
        {
            String tokens = st.nextToken();
            if(normalList.size()== 0 || !normalList.containsKey(tokens) )
            {
                rList =  new ArrayList<ReferenceCount>();
                rCount = new ReferenceCount(name);
                rList.add(rCount);
                normalList.put(tokens,rList);                
            }
            else if(normalList.containsKey(tokens)  )
            {
                System.out.println("Match found");
                Iterator it = normalList.entrySet().iterator();
                while (it.hasNext())
                {
                    Map.Entry pair = (Map.Entry)it.next();
                    ArrayList<ReferenceCount> rList1 = new ArrayList<ReferenceCount>();
                    rList1 =(ArrayList)pair.getValue();
                    for( ReferenceCount rC : rList1 )
                    {
                        if(pair.getKey().equals(rC.getDocumentId()))
                        {
                            System.out.println("Match found 2 ");
                           rC.increment();
                        }
                    }
                }
            }
        }
       //to display the hashmap
Iterator it = normalList.entrySet().iterator();
            while (it.hasNext())
            {
                Map.Entry pair = (Map.Entry)it.next();
                System.out.println(pair.getKey()+ ",");
                ArrayList<ReferenceCount> rList1 = new ArrayList<ReferenceCount>();
                rList1 =(ArrayList)pair.getValue();
                for( ReferenceCount rC : rList1 )
                {
                    rCount = new ReferenceCount(name);
                    System.out.println(rCount.getDocumentId()+","+rCount.getCount());
                }


            }
       }
1个回答

1
你在单词上使用了一个地图,为什么不对文档ID使用相同的地图呢?你可以像这样创建一个HashMap of HashMaps:
HashMap<String, HashMap<String, Integer>> wordCountMap = 
       new HashMap<String, HashMap<String, Integer>>();

对于你的值,你可以创建一个单独的HashMap,以单词作为键,计算出来的值作为值:

HashMap<String, String> wordValueMap = new HashMap<String, String>(); 

对于每个单词,您检查wordCountMap.containsKey(newWord)是否存在,如果不存在,则创建具有新documentId和计数为1的内部HashMap。如果该键已存在,则获取现有的内部HashMap,然后检查documentId是否存在,以此类推...最后,您可以将计算出的value单独维护在wordValueMap中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接