在Java中向HashMap的ArrayList中的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

我有一个Java的源HashMap:

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
具有type
HashMap
,编译人员应该已经为您处理了强制转换。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));