【发布时间】:2012-09-12 19:03:22
【问题描述】:
我在 Java 中有一个源 HashMap:
HashMap<String, Integer> keyWordFrequencies;
存储各种长度的关键字。我想遍历这个 HashMap 并计算出存储在映射的 String 部分中的 ngram 的长度,该部分定义了每个关键字的文本。
有了这些数据,我想填充 HashMaps 的目标 ArrayList:
ArrayList<HashMap<String, Integer>> keywordNgrams;
根据结果,ArrayList 的索引对应于给定关键字的 ngram 大小减一,即,keywordNGrams(0) 将接收 unigram,keywordNGrams(1) 将接收 bigram,依此类推。但我不确定必要的语法。遍历源 HashMap 很简单:
Set keyWordFrequenciesSet = keyWordFrequencies.entrySet();
Iterator keyWordFrequenciesIterator = keyWordFrequenciesSet.iterator();
while(keyWordFrequenciesIterator.hasNext()) {
Map.Entry m = (Map.Entry) keyWordFrequenciesIteratorIterator.next();
int ngramLength = String_Utils.getLengthOfNgram(m.getKey().toString());
Add element to keywordNgrams?
但是将元素添加到 HashMap 的目标 ArrayList 让我感到困惑。我试过了:
keywordNgrams.add(ngramLength, m);
还有各种选择,但无济于事。 m 应该是 HashMap 的一个元素,而不是 HashMap 本身。谁能建议我错在哪里?
理想情况下,我想遍历一次源 HashMap keyWordFrequencies,然后将keywordNgrams ArrayList 初始化为开始时可能的最大ngram 大小。
【问题讨论】:
-
在开始之前,您是否已经知道最大的 ngram-size 是多少?也就是说,你知道
keywordNgrams.size()的最终值是多少吗?如果是这样,那么您最好将keywordNgrams预先填充到该大小;如果没有,那么每当您遇到比以前更大的 ngram 时,您将需要一个循环来将keywordNgrams扩展到所需的大小。 -
是的,我知道这一点。一个 ngram 的最大长度应该是 5。
-
keywordNgrams.add(ngramLength, m);将不起作用,因为m是Map.Entry实例,而不是HashMap的实例。您确定要ArrayList<HashMap>而不是ArrayList<Map.Entry>?使用ArrayList<HashMap>,您将创建一个包含 5 个元素的列表,每个元素都是完全相同的 HashMap,我怀疑这是您想要的。 -
然后通过m本身访问key和value?听起来很有希望。
-
感谢受访者:我会在早上试试这些看看。