【问题标题】:copying a java treemap of treemap using putAll()使用 putAll() 复制树形图的 java 树形图
【发布时间】:2012-03-22 10:14:53
【问题描述】:

我在 TreeMap 中有一个 TreeMap。

TreeMap <String, TreeMap<String, Double>> x_probs_org = new TreeMap<String, TreeMap<String, Double>>();

但是当我用完全相同的定义制作另一个,然后复制第一个时:

x_probs.putAll(x_probs_org);

我注意到新的树形图不会复制所有内容。它正确复制所有字符串键,但仅复制值中的最后一个元素(TreeMap)。除了滚动整个第一个树状图然后将元素添加到新树状图之外,还有什么更简单的方法可以做到这一点?

我只需要一开始就具有相同的数据结构和相同的数据。我所做的是运行循环,通过它填充第一个树形图,然后简单地将下一个与它放在同一个循环中。这也不起作用:

// build tempMap up there...
x_probs_org.put(tokens[0], tempMap);    
x_probs.put(tokens[0], tempMap);

x_probs 坚持丢失 x_probs_org 设法获取的数据。 “tempMap”是否会因填充一次而耗尽?

【问题讨论】:

    标签: java copy treemap


    【解决方案1】:

    这对我有用:

    public static void main(String[] args) {
        Map <String, Map<String, Double>> map = new TreeMap<String, Map<String, Double>>();
        Map<String, Double> innerMap = new TreeMap<String, Double>();
        innerMap.put("a", 1.0);
        innerMap.put("b", 2.0);
        map.put("inner1", innerMap);
        innerMap = new TreeMap<String, Double>();
        innerMap.put("c", 3.0);
        innerMap.put("d", 4.0);
        map.put("inner2", innerMap);
    
        Map <String, Map<String, Double>> newMap = new TreeMap<String, Map<String, Double>>();
        newMap.putAll(map);
    
        System.out.println(map); // prints {inner1={a=1.0, b=2.0}, inner2={c=3.0, d=4.0}}
        System.out.println(newMap); // prints {inner1={a=1.0, b=2.0}, inner2={c=3.0, d=4.0}}
    }
    

    【讨论】:

      【解决方案2】:

      另一种简单的方法如下:

      newMap = x_probs_org.clone();

      【讨论】:

        【解决方案3】:

        您可以简单地使用TreeMap(SortedMap&lt;K,? extends V&gt; m) 构造函数,如下所示:

        TreeMap <String, TreeMap<String, Double>> x_probs_org = new TreeMap<String, TreeMap<String, Double>>();
        
        TreeMap <String, TreeMap<String, Double>> x_probs = new TreeMap<String, TreeMap<String, Double>>(x_probs_org);
        

        【讨论】:

          【解决方案4】:

          您很可能正在重用引用(如 tempMap),这就是为什么您的 x_probs_org 也不是您期望的那样。或者您会因为您通过原始文件修改副本元素而感到惊讶。

          以下工作完美:

          TreeMap<String, TreeMap<String, Double>> x_probs_org = 
              new TreeMap<String, TreeMap<String, Double>>();
          TreeMap<String, Double> inner = new  TreeMap<String, Double>();
          inner.put("entry1", 1d);
          inner.put("entry2", 2d);
          x_probs_org.put("inner", inner);
          
          TreeMap<String, TreeMap<String, Double>> x_probs = 
              new TreeMap<String, TreeMap<String, Double>>();
          x_probs.putAll(x_probs_org);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-11-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-01-14
            • 1970-01-01
            相关资源
            最近更新 更多