我正在研究 nGram,并且使用嵌套的 TreeMap 类型的数据结构来存储 ngram。 Quadgrams 的模板如下所示。
public TreeMap<String, TreeMap<String, TreeMap<String, TreeMap<String, Integer>>>> ngramWordCounter;
当我尝试将其转储到文件时,问题就出现了,基本上我正在迭代第一个映射的键集,然后迭代到第二个映射的键映射,依此类推。结果创建了很多临时对象,并且我收到 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
}
}
}
}
是否有更好的方法来迭代此列表而不创建临时对象?
最佳答案
不会创建新对象。将创建新的引用。
Map 返回对键集中键的引用。使用this reference要探索这个概念,或者您可以阅读有关此概念的 java 教程。
我更喜欢以下迭代 map 的方式
for (Map.Entry<String, String> entry : map.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
// process key and value
}
关于java - 如何在不创建临时对象的情况下迭代嵌套的 TreeMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22189340/