2014-03-05 77 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對象本身。但是所有的處理都在循環內部(從給定的示例代碼猜測) –