在 Java 中:如何“完全”复制以集合作为值的 Map?

问题描述 投票:0回答:1

下面的代码说明了我的问题:

public class TreeMapCopyProblem {

    private static TreeMap<Integer, SortedSet<Integer>> treeMap1;

    private static TreeMap<Integer, SortedSet<Integer>> treeMap2;

    public static void main(String[] args) {

        fillTreeMap1();
        initializeTreeMap2();
        test();
    }

    private static void initializeTreeMap2() {
        treeMap2 = (TreeMap<Integer, SortedSet<Integer>>) treeMap1.clone();
    }

    private static void fillTreeMap1() {
        treeMap1 = new TreeMap<>();
        SortedSet<Integer> values0 = Stream.of(0).collect(Collectors.toCollection(TreeSet::new));
        SortedSet<Integer> values1 = Stream.of(1).collect(Collectors.toCollection(TreeSet::new));
        SortedSet<Integer> values2 = Stream.of(2).collect(Collectors.toCollection(TreeSet::new));

        treeMap1.put(0, values0);
        treeMap1.put(1, values1);
        treeMap1.put(2, values2);

        //Once fill, this treeMap does not have to be modified anymore
    }

    private static void test(){
        treeMap2.get(0).add(99);
        System.out.println(treeMap1);
    }

}

TreeMap1 也被修改,因为它是引用同一集合的浅拷贝。

我使用

也有同样的行为

treeMap2 = new TreeMap<>(treeMap1);

那么...我们如何简单地对现有 Tree Map 进行非浅复制,以便我们可以从现有 TreeMap 初始化一个新 TreeMap,然后仅修改第二个 TreeMap?

java java-17 shallow-copy cloning
1个回答
0
投票
  private static void initializeTreeMap2() {
    treeMap2 = (new TreeMap<>());
    treeMap1.forEach((integer, integers) -> {
        SortedSet<Integer> newSet = new TreeSet<>(integers);
        treeMap2.put(integer, newSet);
    });
}

这有效。但这是好方法吗?

© www.soinside.com 2019 - 2024. All rights reserved.