将对象树/层次结构复制到另一个对象树中

时间:2013-12-31 06:06:58

标签: java

我通过示例程序问这个问题。我有一个用例,我有一个对象树/层次结构。想象一下,有一个名为test的pojo,它有两个字段firstname,lastname和List testList。现在我正在创建一个对象层次结构,如下所示。

test obj1                    
   |-- test obj2            
   |      |-- test obj4     
   |      |-- test obj5     
   |-- test obj3  

测试obj1有一个名为test obj2和test obj3的两个对象的列表。内部测试obj2有一个名为test obj4和test obj5

的另外两个对象的列表

在类test1中的printTreeContents方法中,我能够打印测试对象层次结构的所有属性值。现在我想将相同的测试对象层次结构填充到另一个名为finalObject的对象中,该对象也具有类似于测试对象的属性。基本上我想将相同的测试对象树复制到这个新的finalObject树中。知道我怎么能继续这样做?我想有一个通用的解决方案因为对象的层次结构会有所不同。

finalObject1                   
   |-- finalObject2            
   |      |-- finalObject4   
   |      |-- finalObject5  
   |-- finalObject3            

finalObject1有一个名为finalObject2和finalObject3的两个对象的列表。在内部,finalObject2有一个名为finalObject4和finalObject5

的另外两个对象的列表
public class test {
   private String firstName;
   private String lastName;
   private List<test> testList;

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setTestList(List<test> testList) {
        this.testList = testList;
    }

    public List<test> getTestList() {
        return testList;
    }
}

public class test1 {

        public static void main(String[] args) {
        ArrayList<test> objList = new ArrayList<test>();
        test obj = new test();
        obj.setFirstName("firstname1");
        obj.setLastName("lastname1");

        test obj2 = new test();
        obj2.setFirstName("firstname2");
        obj2.setLastName("lastname2");

        test obj3 = new test();
        obj3.setFirstName("firstname3");
        obj3.setLastName("lastname3");

        test obj4 = new test();
        obj4.setFirstName("firstname4");
        obj4.setLastName("lastname4");

        test obj5 = new test();
        obj5.setFirstName("firstname5");
        obj5.setLastName("lastname5");

        ArrayList<test> childobjList2 = new ArrayList<test>();
        childobjList2.add(obj4);
        childobjList2.add(obj5);

        obj2.setTestList(childobjList2);

        ArrayList<test> childobjList = new ArrayList<test>();
        childobjList.add(obj2);
        childobjList.add(obj3);

        obj.setTestList(childobjList);
        objList.add(obj);

        System.out.println(" Object Tree creation Completed");
        test1 tst1 = new test1();
        tst1.printTreeContents(obj);

        System.out.println("Iterating through object tree completed");
    }

    private void printTreeContents(test node) {
         if (node.getTestList() != null) 
         {
            for (test child : node.getTestList()) 
            { 
                System.out.println("first name is " + child.getFirstName());
                System.out.println("last name is " + child.getLastName());
                printTreeContents(child);
            }
        }
    }
}

public class finalObject{
   private String firstName;
   private String lastName;
   private List<test> testList;

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setTestList(List<test> testList) {
        this.testList = testList;
    }

    public List<test> getTestList() {
        return testList;
    }
}

上述程序的输出是

Object Tree creation Completed
first name is firstname2 
last name is lastname2 
first name is firstname4
last name is lastname4
first name is firstname5
last name is lastname5
first name is firstname3
last name is lastname3
Iterating through object tree completed

2 个答案:

答案 0 :(得分:0)

首先 - 在您的代码中,您正在跳过根节点(名字1和姓氏1)。这是故意的吗?我假设这是一个错误,所以我将在下面的示例中修复它。

要执行深层复制,而不是递归地打印值,您可以通过执行类似

的操作来递归地构建树。
private void deepCopyTree(Node node, Node nodeCopy) {
     if(node == null) { return; }
     nodeCopy.setFirstName(node.getFirstName());
     nodeCopy.setLastName(node.getLastName());

     if (node.getTestList() == null) { return; }

     for (Node child : node.getChildren()) { 
         Node copiedChild = new Node();
         nodeCopy.addChild(copiedChild);
         buildTree(child, copiedChild);
     }
}

答案 1 :(得分:0)

一个非常简单的解决方案是使用复制构造函数。这将起作用,因为复制列表会再次在子项上调用复制构造函数。孩子们将反过来复制他们的孩子。这个解决方案非常通用。

class Test {
    List<Test> children;

    Test(Test other) {
        if(other.children != null) {
            children = new ArrayList<Test>(other.children.size());

            for(Test child : other.children)
                children.add(new Test(child)); // call copy constructor again
        }
    }
}

我不明白你finalObject的重要性。它看起来与test相同。