2014-03-05 48 views
1

我正在研究一个nGrams,并且我使用嵌套的TreeMap类数据结构来存储ngrams。 Quadgrams的模板如下所示。如何迭代嵌套的TreeMap而不创建临时对象

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 
     } 
    } 
    } 
} 

有没有更好的方式来遍历此列表而不创建临时对象?

回答

1

不会创建新对象。新的参考将被创建。

映射返回对keyset中键的引用。使用this reference来探索这个概念,或者你可以阅读关于这个概念的java教程。

我更喜欢下面的方式来遍历地图

for (Map.Entry<String, String> entry : map.entrySet()) { 
     String key = entry.getKey(); 
      String value = entry.getValue(); 
      // process key and value 
} 
+0

恰好引用'字符串key'和'字符串value'循环结束后怎么办?这些变量需要通过GarbageCollector来实现,因为Strings确实是对象。 [http://stackoverflow.com/questions/18406703/when-will-a-string-be-garbage-collected-in-java] –

+0

是的引用将被删除而不是实际的对象。如果你检查实现,内部TreeMap存储Entry对象本身。但是所有的处理都在循环内部(从给定的示例代码猜测) –