我正在研究nGrams,我正在使用嵌套的TreeMap数据结构来存储ngrams。 Quadgrams的模板看起来像这样。
public TreeMap<String, TreeMap<String, TreeMap<String, TreeMap<String, Integer>>>> ngramWordCounter;
当我试图将其转储到文件时,问题就出现了,基本上我正在迭代第一个地图的keySet,然后进入第二个地图的键盘映射,依此类推。结果创建了很多临时对象,我得到了GCOverlimitExceeded错误。用于迭代的代码片段如下,
for(String key: ((Quadgram)quadgram).ngramWordCounter.keySet())
{
for(String key1: ((Quadgram)quadgram).ngramWordCounter.get(key).keySet())
{
for(String key2: ((Quadgram)quadgram).ngramWordCounter.get(key).get(key1).keySet())
{
for(String key3:((Quadgram)quadgram).ngramWordCounter.get(key).get(key1).get(key2).keySet())
{
//Do something
}
}
}
}
有没有更好的方法来迭代这个列表而不创建临时对象?
答案 0 :(得分:1)
不会创建新对象。将创建新的参考文献。
Map返回对keyset中key的引用。使用this reference来探索这个概念,或者您可以阅读有关此概念的Java教程。
我更喜欢以下方式迭代地图
for (Map.Entry<String, String> entry : map.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
// process key and value
}