2012-11-22 2 views
0

클래스 Foo 클래스와 클래스 Boo.Foo 클래스에는 Boo 클래스의 arraylist가 포함되어 있습니다. 나는 Foo 클래스의 깊은 복사본을 만들어야하고 Foo 자체의 arraylist를 만들고있다. 이것을 어떻게 할 수 있습니까?arraylist를 포함하는 arraylist 복사하기

 Class Foo{ 
     ArrayList<Boo> boovar = new ArrayList<Boo>(); 
     } 

     Class Boo{ 
     int x; 
     void add_x(int y) 
     { 
      x=y; 
     } 
     } 

     ArrayList<Foo> foovar = new ArrayList<Foo>(); 


    ..adding elements to foovar. 

지금 나는 foovar에있는 개체의 깊은 복사가되도록, Foo 타입의 ArrayList에의 foovar1을 만들려고합니다. 즉, foovar에서 boo 객체를 수정하면 x를 삭제하거나 요소를 추가하는 것과 같이 foovar1에 액세스 할 때 반영되어서는 안됩니다.

나는 딥 복사가 죽을 때까지 맞았다는 것을 알고 있지만 실제로이 작업을 수행하는 방법을 알려주는 기사를 찾을 수 없습니다. 누군가 코드를 어떻게 보여줄 수 있습니까?

편집 :

임 언급 한 코멘트처럼, 푸 내에서 복사 생성자를 만들려고하지만, 내가 푸의 생성자를 통해 서로에 우우의 ArrayList를 복사하는 방법에 대한 손실에 정말입니다. 아라 일리안에서 Foo의 인스턴스를 어떻게 복제 할 것인가는 말할 것도 없습니다. 어떤 도움이라도 정말 감사 할 것입니다!

+1

당신은 루프를 사용하고리스트의 딥 카피를 만들기 위해'Foo' 클래스에 생성자를 복사해야한다고 생각합니다. 왜냐하면, 당신은 당신의 List의 deep copy뿐만 아니라 당신의 List에있는'Foo' 인스턴스의 deep copy를 필요로하기 때문입니다. –

+1

"Java deep copy"를 여기에서 찾으려고 했습니까? 너는 많은 포스트를 얻을 것이다. 어떤 것은 도서관을 가리키고 다른 도서관은 정보와 팁을 가지고 있습니다. 그 후에도 여전히 특정 질문이 있으면 물어볼 수 있습니다. 이 질문을 귀하의 질문에 관련이있을 수 있습니다 : http://stackoverflow.com/questions/3291830/deep-copy-and-arraylist-java –

+0

추상 '목록 ', 귀하의 변수를 선언하지 콘크리트. 좋은 습관입니다. – Bohemian

답변

1

첫째, 당신은 당신의 우우 클래스의 복사 생성자를 만들 필요가 : 위의와

Class Boo{ 
    int x; 

    //copy constructor 
    public Boo (Boo sourceBoo){ 
    x = sourceBoo.x; 
    } 

} 

, 당신은 야유의 배열이 그 안에 포함 된 복사 푸 클래스의 복사 생성자를 만들 수 있습니다

Class Foo{ 
    ArrayList<Boo> boovar = new ArrayList<Boo>(); 

    //copy constructor 
    public Foo(Foo sourceFoo){ 
    for (Boo aBoo:sourceFoo.boovar){ 
     boovar.add(new Boo(aBoo)); 
    } 
    } 

} 

이제 Foo (s) 배열을 반복하여 하나씩 새로운 배열로 복사 할 수 있습니다. 당신은 그렇게 할 수있는 방법을 정의 할 수 있습니다 :

public ArrayList<Foo> deepCopyFooList(ArrayList<Foo> sourceArray){ 
    ArrayList<Foo> targetList = new ArrayList<Foo>(); 
    for (Foo aFoo:sourceArray){ 
    targetList.add(new Foo(aFoo)); 
    } 

    return targetList; 
} 

그래서 당신이하고자 배열을 복사 :

ArrayList<Foo> foovar = new ArrayList<Foo>(); 
ArrayList<Foo> foovarCopy = deepCopyFooList(foovar); 
+0

정말 고마워요!그것은 나를 이해하는 데 도움을 줄뿐 아니라 장애없이 일했습니다! 내가 할 수 있다면, 나는 그것을 하나 이상의 upvote 줄 것이다 !! – Floose

+0

당신은 환영합니다 :) –

0

편집 :

List<Boo> newCopy = new ArrayList<Boo>(boovar); 
newCopy.addAll(boovar); 

이 boovar의 요소는 불변 ..provided. 그렇지 않은 경우에는 Boo 클래스에서 clone() 메서드를 사용해야합니다.

+0

두 가지 방법 모두 얕은 사본을 만들고 질문에 필요한만큼 깊은 사본을 만들지 마십시오. –

+0

네 말이 맞아. 나는 그 글을 편집 했어. –