在Java中向HashMap的ArrayList中的HashMap添加元素
我有一个Java的源HashMap:在Java中向HashMap的ArrayList中的HashMap添加元素,java,arraylist,hashmap,Java,Arraylist,Hashmap,我有一个Java的源HashMap: HashMap<String, Integer> keyWordFrequencies; 但是将元素添加到HashMap的目标ArrayList让我感到困惑。我试过: keywordNgrams.add(ngramLength, m); 还有各种各样的选择,但都无济于事。m应该是HashMap的元素,而不是HashMap本身。有人能指出我错在哪里吗 理想情况下,我希望遍历一次源HashMap关键字频率,然后将关键字Ngrams ArrayLi
HashMap<String, Integer> keyWordFrequencies;
但是将元素添加到HashMap的目标ArrayList让我感到困惑。我试过:
keywordNgrams.add(ngramLength, m);
还有各种各样的选择,但都无济于事。m应该是HashMap的元素,而不是HashMap本身。有人能指出我错在哪里吗
理想情况下,我希望遍历一次源HashMap关键字频率,然后将关键字Ngrams ArrayList初始化为开始时可能的最大ngram大小。由于您处理的是大小为5的ArrayList,我建议在初始化ArrayList时,通过在每个索引处添加HashMap的新实例来实现。大概是这样的:
ArrayList<HashMap<String, Integer>> keywordNgrams = new ArrayList<HashMap<String, Integer>> ();
for(int index = 0; index < 5; index++){
keywordNgrams .put(index, new HashMap<String, Integer>());
}
HashMap<String, Integer> returnedMap = keywordNgrams.get(index); //where index is the position in the list;
returnedMap.put(key, value); //where key & value is the information that you would want to add to your HashMap
keywordNgrams.set(index, returnedMap);
由于您知道最大的ngram大小,我建议预先填充
关键字ngram
:
List<Map<String, Integer>> keywordNgrams =
new ArrayList<Map<String, Integer>>();
for(int i = 0; i < 5; ++i)
keywordNgrams.add(new HashMap<String, Integer>());
在开始之前,您是否已经知道最大的ngram大小是多少?也就是说,您知道
keywordNgrams.size()
的最终值是多少吗?如果是这样,那么最好预先填充keywordNgrams
到该大小;如果没有,那么当你遇到比以前更大的ngram时,你需要一个循环来将关键字ngram
扩展到所需的大小。是的,我知道这一点。ngram的最大长度应为5。关键字ngrams.add(ngramLength,m)
将不起作用,因为m
是一个映射。Entry
实例,而不是HashMap
的实例。您确定要的是ArrayList
而不是ArrayList
?使用ArrayList
,您将创建一个包含5个元素的列表,每个元素都是完全相同的HashMap,我怀疑这是您想要的。然后通过m本身访问键和值?听起来很有希望。感谢受访者:我会在早上尝试这些,看看。这将使用正确的Ngram填充目标关键字ngrams哈希图,但不包含源关键字频率中的频率。但是通过移除if…else和:map.put(key.toString(),((Integer)关键字frequencies.get(key.toString()).intValue());看起来还不错。非常感谢。@Morgan先生:啊,我明白了。我不明白为什么您的原始映射是从String
到Integer
,但我现在明白了。我会相应地更新我的答案。@Morgan先生:我已经更新了我的答案。如您所见,您不需要使用key.toString()
,也不需要强制转换为Integer
,只要保留开头的类型:因为keyWordFrequencies
具有typeHashMap
,编译人员应该已经为您处理了强制转换。FAO ruakh:我已经尝试了您修改过的代码,它似乎工作得很好。为了稍微澄清一下,我需要使用专用的目标HashMaps来记录每个ngram在原始HashMaps中出现的次数,即,keywordNgrams(0)
存储Unigram,keywordNgrams(1)
存储Bigram及其频率,keywordNgrams(2)
将存储Trigram等等。我想另一种选择是使用一个很长的目标HashMap将所有的uni、bi和trig存储在一起,但这可能不够灵活。谢谢你的帮助。
HashMap<String, Integer> returnedMap = keywordNgrams.get(index); //where index is the position in the list;
returnedMap.put(key, value); //where key & value is the information that you would want to add to your HashMap
keywordNgrams.set(index, returnedMap);
List<Map<String, Integer>> keywordNgrams =
new ArrayList<Map<String, Integer>>();
for(int i = 0; i < 5; ++i)
keywordNgrams.add(new HashMap<String, Integer>());
for(final String keyword : keyWordFrequencies.keySet())
keywordNgrams.get(String_Utils.getLengthOfNgram(keyword) - 1)
.put(keyword, keyWordFrequencies.get(keyword));