使用putAll()复制树映射的java树映射

使用putAll()复制树映射的java树映射,java,copy,treemap,Java,Copy,Treemap,我在树状图中有一个树状图 TreeMap <String, TreeMap<String, Double>> x_probs_org = new TreeMap<String, TreeMap<String, Double>>(); 我注意到新的树形图并没有复制所有内容。它正确复制所有字符串键,但只复制值中的最后一个元素(TreeMap)。除了滚动整个第一个树状图,然后将元素添加到新的树状图之外,还有什么更简单的方法可以做到这一点吗 首先,我需要

我在树状图中有一个树状图

TreeMap <String, TreeMap<String, Double>> x_probs_org = new TreeMap<String, TreeMap<String, Double>>();
我注意到新的树形图并没有复制所有内容。它正确复制所有字符串键,但只复制值中的最后一个元素(TreeMap)。除了滚动整个第一个树状图,然后将元素添加到新的树状图之外,还有什么更简单的方法可以做到这一点吗

首先,我需要有相同的数据结构和相同的数据。我所做的是运行我填充第一个树状图的循环,然后简单地将下一个树状图放在同一个循环中。这也不起作用:

// build tempMap up there...
x_probs_org.put(tokens[0], tempMap);    
x_probs.put(tokens[0], tempMap);
x_probs坚持x_probs_组织设法获取的数据丢失。“tempMap”是否会因为填充某个内容而变得筋疲力尽?

这对我很有用:

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}}
}
publicstaticvoidmain(字符串[]args){
Map Map=newtreemap();
Map innerMap=新树映射();
innerMap.put(“a”,1.0);
innerMap.put(“b”,2.0);
map.put(“inner1”,innerMap);
innerMap=新树映射();
innerMap.put(“c”,3.0);
innerMap.put(“d”,4.0);
map.put(“inner2”,innerMap);
Map newMap=newtreemap();
newMap.putAll(map);
System.out.println(map);//打印{inner1={a=1.0,b=2.0},inner2={c=3.0,d=4.0}
System.out.println(newMap);//打印{inner1={a=1.0,b=2.0},inner2={c=3.0,d=4.0}
}

另一种简单方法如下:


newMap=x_probs_org.clone()

您只需使用
TreeMap(SortedMap 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);
TreeMap x_probs_org=newtreemap();
TreeMap x_probs=新的TreeMap(x_probs_org);

很可能您正在重用引用(如tempMap),这就是为什么您的x_probs_组织也不是您所期望的。或者您会感到惊讶,因为您通过“原始”修改了副本的元素

以下几点效果很好:

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);
TreeMap x_probs_org=
新树映射();
TreeMap inner=新的TreeMap();
内部放置(“入口1”,1d);
内部放置(“入口2”,2d);
x_probs_org.put(“内部”,内部);
树映射x_probs=
新树映射();
x_probs.putAll(x_probs_组织);
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);