如何在不创建临时对象的情况下迭代嵌套的 TreeMap

Posted

技术标签:

【中文标题】如何在不创建临时对象的情况下迭代嵌套的 TreeMap【英文标题】:How to iterate over a nested TreeMap without creating temporary Objects 【发布时间】:2014-03-05 05:29:03 【问题描述】:

我正在研究 nGram,并且我正在使用嵌套的 TreeMap 类型的数据结构来存储 ngram。 Quadgrams 的模板如下所示。

public TreeMap<String, TreeMap<String, TreeMap<String, TreeMap<String, Integer>>>> ngramWordCounter;

当我尝试将其转储到文件时出现问题,基本上我正在迭代第一个映射的 keySet,然后进入第二个映射的 keymap,依此类推。结果创建了很多临时对象,我得到了 GCOverlimitExceeded 错误。迭代的代码sn-p如下,

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】:

不会创建新对象。将创建新的引用。

Map 返回对键集中键的引用。使用this reference 来探索这个概念,或者您可以阅读有关此概念的 java 教程。

我更喜欢以下迭代地图的方式是

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

【讨论】:

循环终止后引用String keyString value 会发生什么情况?这些变量需要被 GarbageCollector 清除,因为字符串确实是对象。 [***.com/questions/18406703/… 是的,引用将被删除而不是实际对象。如果检查实现,TreeMap 内部会存储 Entry 对象本身。但所有处理都在循环内(根据给定的示例代码猜测)

以上是关于如何在不创建临时对象的情况下迭代嵌套的 TreeMap的主要内容,如果未能解决你的问题,请参考以下文章

如何在不改变的情况下更新对象数组的嵌套数组的状态

如何在不复制的情况下从 N 维容器中获取可迭代范围?

如何在不创建临时列的情况下从 pandas 数据框列计算最小值?

如何在不创建其他字段的情况下生成一个列表的嵌套 formik 表单或表单字段?

如何在不创建嵌套数组的情况下将多个变量添加到数组

临时对象的生命周期:嵌套函数调用中临时向量的迭代器