0

我在 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 大小。

4

2 回答 2

1

由于您正在处理大小为 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>());
}

为了在 ArrayList 中添加元素,您需要执行以下操作:

  • 访问指定 'n'-gram 的特定 HashMap。这可以get(int index)在 ArrayList 上使用
  • 然后,您将添加您返回的 HashMap 的元素,然后再次对您的关键字 Ngrams ArrayListset(int index, E element)执行相同的 HashMap 。

示例代码可能是这样的:

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);
于 2012-09-12T19:13:59.240 回答
0

由于您知道最大的 ngram-size,我建议预先填充keywordNgrams

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));
于 2012-09-12T19:15:34.877 回答