有点晚输入。但是我遇到了类似的问题,但得到了不同的解决方案。但不确定它是否防弹。所以请随时发表评论,让我学习!
我有一个名为“数字”的类型,因为我没有创意命名的东西。每个“Numbers”类型的对象都有一个内部列表,可以携带“Numbers”类型的附加对象,其中每个对象都有一个附加“Numbers”列表,每个...等等。
基本上你可以制作一个类似于这样的树结构:
我通过在“数字”类中使用递归复制构造函数解决了深层复制问题。
数字类:
import java.util.ArrayList;
public class Numbers {
private ArrayList<Numbers> numbers = new ArrayList<>();
private int number;
public Numbers(int number) {
this.number = number;
}
public Numbers(Numbers numToCopy) {
this.number = numToCopy.getNumber();
ArrayList<Numbers> list = numToCopy.getNumbers();
for(int i = 0; i < list.size(); i++) {
Numbers n = new Numbers(list.get(i));
numbers.add(n);
}
}
public void addNumber(Numbers i) {
numbers.add(i);
}
public ArrayList<Numbers> getNumbers() {
return numbers;
}
public void setNumber(int i) {
this.number = i;
}
public int getNumber() {
return number;
}
public ArrayList<Numbers> getAllNumbers(ArrayList<Numbers> list) {
int size = numbers.size();
list.addAll(numbers);
for(int i = 0; i < size; i++) {
numbers.get(i).getAllNumbers(list);
}
return list;
}
}
用法:
import java.util.ArrayList;
public class NumbersTest {
public NumbersTest() {
}
public static void main(String[] args) {
Numbers num0 = new Numbers(0);
Numbers num1 = new Numbers(1);
Numbers num2 = new Numbers(2);
Numbers num3 = new Numbers(3);
Numbers num4 = new Numbers(4);
Numbers num5 = new Numbers(5);
Numbers num6 = new Numbers(6);
num0.addNumber(num1);
num0.addNumber(num2);
num1.addNumber(num3);
num1.addNumber(num4);
num2.addNumber(num5);
num2.addNumber(num6);
num4.addNumber(num6);
//Deep copy here!
Numbers numCopy = new Numbers(num0);
//Change deep down in graph of original
num0.getNumbers().get(0).getNumbers().get(1).getNumbers().get(0).setNumber(799);
//Printout of copy to show it was NOT affected by change in original.
for(Numbers n : numCopy.getAllNumbers(new ArrayList<Numbers>())) {
System.out.println(n.getNumber());
}
}
}
使用代码表明,在原始 num0 对象的“图形”内部进行更改,不会更改由它制成的副本。
图中有两个六(6),没关系,因为它们在不同的分支上。不利的一面是,如果相同的数字会通过其中一条路径重复,例如在第一个 1 下方的某处有( 1 )。然后它将以无限循环结束。
请发表评论!:)