注意:我查看过不同的地方,包括stackoverflow,但没有找到解决方法。
问题:
class Animal{
AnimalGroup animalGroup;
}
class AnimalGroup{
List<Animal> animalList;
}
class MainProgram{
// Map<groupRank, animalGroup>
Map<Integer, AnimalGroup> rankedAnimalGroups;
}
注意:很明显,一个Animal只能属于一个AnimalGroup。
我想深度复制地图 rankingAnimalGroups 。
案例1:克隆
我将使我的Animal and AnimalGroup克隆。
AnimalGroup中的克隆方法
protected Object clone() throws CloneNotSupportedException {
AnimalGroup clonedAnimalGroup = (AnimalGroup)super.clone();
for(Animal animal: animalList)
clonedAnimalGroup.addAnimal(animal.clone);
return clonedAnimalGroup;
}
动物中的克隆方法
protected Object clone() throws CloneNotSupportedException {
Animal clonedAnimal = (Animal)super.clone();
clonedAnimal.animalGroup = animalGroup.clone();
}
这将最终进入AnimalGroup调用Animal并反转的循环。
案例2:copyConstructor
HashMap不支持深层复制构造函数
建议的解决方案
我可以使用Animal的构造函数,在AnimalGroup的clone方法中,如下所示
AnimalGroup中的克隆方法
protected Object clone() throws CloneNotSupportedException {
AnimalGroup clonedAnimalGroup = (AnimalGroup)super.clone();
for(Animal animal: animalList)
clonedAnimalGroup.addAnimal(new Animal(animal, this));
return clonedAnimalGroup;
}
动物中的构造函数
public Animal(Animal other, AnimalGroup animalGroup)
{
this.animalGroup = animalGroup;
...
}
问题 在这种情况下,是否有更好的深度复制解决方案。
EDIT1
数据大小对于序列化相关方法来说太大了。
EDIT2
我无法在我的项目中包含外部库等复制
答案 0 :(得分:2)
您可以为自己提供执行深层复制所需的辅助方法。深度复制Animal
时,请获取其组的深层副本,并返回与正在复制的Animal
对应的该组成员;深度复制组时,获取成员的新副本而不为其分配任何组,将这些新副本添加到新列表,将该列表指定为每个元素的组,然后返回新列表。这样做将要求该组可以访问不立即分配组的特殊构造函数。
此主题还有其他类似的变体。
答案 1 :(得分:1)
您可以serialize-deserialize 深度克隆的强大方式