Làm cách nào để sao chép nội dung của một ArrayList sang một ArrayList khác?


85

Tôi có một số cấu trúc dữ liệu và tôi muốn sử dụng một cấu trúc dữ liệu tạm thời và một cấu trúc khác không phải là tạm thời.

ArrayList<Object> myObject = new ArrayList<Object>();
ArrayList<Object> myTempObject = new ArrayList<Object>();


//fill myTempObject here
....

//make myObject contain the same values as myTempObject
myObject = myTempObject;

//free up memory by clearing myTempObject
myTempObject.clear();

bây giờ vấn đề với điều này tất nhiên là nó myObjectthực sự chỉ được trỏ đến myTempObject, và vì vậy một khi myTempObjectđược xóa, cũng vậy myObject.

Làm cách nào để giữ lại các giá trị từ myTempObjectkhi myObjectsử dụng java?


Bạn có thể sử dụng List.addAll. Nhưng nếu bạn cần giữ lại tất cả các đối tượng thì việc xóa danh sách tạm thời sẽ không thực sự xóa toàn bộ bộ nhớ. Bởi vì bạn chỉ đang cố gắng xóa các tham chiếu, xa những đối tượng mà bạn đang cố gắng giữ chúng.
Bhesh Gurung

Theo như tôi biết thì câu trả lời này vẫn còn hiệu lực: stackoverflow.com/questions/715650/…
home

2
Thật khó để diễn giải những gì bạn đang thực sự cố gắng đạt được. Bạn cần giải thích tình huống của mình.
Bhesh Gurung

Câu trả lời:


138

Bạn có thể sử dụng thủ thuật như vậy:

myObject = new ArrayList<Object>(myTempObject);

hoặc dùng

myObject = (ArrayList<Object>)myTempObject.clone();

Bạn có thể lấy một số thông tin về phương thức clone () tại đây

Nhưng bạn nên nhớ rằng tất cả những cách này sẽ cung cấp cho bạn một bản sao Danh sách của bạn , không phải tất cả các phần tử của nó. Vì vậy, nếu bạn thay đổi một trong các phần tử trong Danh sách đã sao chép của mình, nó cũng sẽ bị thay đổi trong Danh sách ban đầu của bạn.


7
gán theo giá trị trong Java là thứ được dành riêng cho các kiểu nguyên thủy (int, byte, char, v.v.) và các chữ. Trừ khi bạn yêu cầu Java sao chép một cách rõ ràng thứ gì đó có nguồn gốc từ Objectnó, sẽ luôn được gán bằng tham chiếu. Nhân tiện clone()là một bản sao cạn và sẽ không sao chép nội dung được chứa Objectsmà là các tham chiếu đến chúng. Nếu bạn muốn tạo một bản sao sâu, hãy xem tại: stackoverflow.com/questions/64036/…
PeterT

@PeterT - Java chỉ được gọi và gán theo giá trị. Các biến kiểu không nguyên thủy chứa các giá trị tham chiếu được gán hoặc truyền.
Brian Roach

Làm ơn tại sao tôi không làm được oldList = newList?
X09

2
@ X09 oldList = newList sẽ sao chép tham chiếu của newList sang oldList, bất kỳ thay đổi nào trong newList cũng sẽ được phản ánh trong oldList. Đó không phải là hành vi dự định.
Sreekanth Karumanaghat

42

originalArrayList. addAll (copyArrayList);

Xin lưu ý : Khi sử dụng phương thức addAll () để sao chép, nội dung của cả danh sách mảng (originalArrayList và copyArrayList) đều tham chiếu đến các đối tượng hoặc nội dung giống nhau. Vì vậy, nếu bạn sửa đổi bất kỳ một trong số chúng, cái kia cũng sẽ phản ánh cùng một thay đổi.

Nếu bạn không làm như vậy thì bạn cần sao chép từng phần tử từ originalArrayList sang copyArrayList, giống như sử dụng vòng lặp for hoặc while.


1
Làm thế nào để ngăn chặn ảnh hưởng đến danh sách khác là có cách nào khác mà chúng tôi có thể xử lý này
Mahesh


17

Không có bản sao ngầm nào được tạo trong java thông qua toán tử gán. Các biến chứa một giá trị tham chiếu (con trỏ) và khi bạn sử dụng, =bạn chỉ đối phó với giá trị đó.

Để bảo quản nội dung của nó, myTempObjectbạn cần tạo một bản sao của nó.

Điều này có thể được thực hiện bằng cách tạo một hàm mới ArrayListbằng cách sử dụng hàm tạo có ArrayList:

ArrayList<Object> myObject = new ArrayList<Object>(myTempObject);

Chỉnh sửa: Như Bohemian đã chỉ ra trong các bình luận bên dưới, đây có phải là điều bạn đang hỏi? Bằng cách làm như trên, cả hai ArrayLists ( myTempObjectmyObject) sẽ chứa các tham chiếu đến các đối tượng giống nhau . Nếu bạn thực sự muốn có một danh sách mới chứa các bản sao mới của các đối tượng có trong myTempObjectđó thì bạn cần tạo một bản sao của từng đối tượng riêng lẻ trong bản gốcArrayList


1
Trong trường hợp này, nó sẽ hoạt động tốt vì việc gọi clear()hàm ArrayList myTempObjectsẽ không ảnh hưởng đến các đối tượng chứa therin. Nếu anh ta muốn bản sao mới của các đối tượng có trong danh sách, đó là một câu chuyện khác, nhưng đó không phải là những gì tôi hiểu câu hỏi này là yêu cầu.
Brian Roach

Bạn biết tôi nghĩ bạn đúng. Tôi đã giải thích sai câu hỏi. Anh ta lo lắng rằng việc dọn sạch một cái sẽ xóa sạch cái kia. Bình luận đã bị xóa.
Bohemian

@Bohemian - Tôi nghĩ đó là một nhận xét công bằng và tôi đã chỉnh sửa bài đăng của mình để phản ánh điều đó. Tôi không nghĩ đó có thể là ý định của OP khi đọc câu hỏi của anh ấy.
Brian Roach

@BrianRoach Cách tạo bản sao của ArrayList bên trong ArrayList.
Arun

8

Đã đi qua điều này trong khi đối mặt với cùng một vấn đề chính tôi.

Nói arraylist1 = arraylist2 đặt chúng trỏ đến cùng một vị trí, do đó nếu bạn thay đổi hoặc thay đổi dữ liệu và do đó cả hai danh sách luôn giữ nguyên.

Để sao chép các giá trị vào một danh sách độc lập, tôi chỉ sử dụng foreach để sao chép nội dung:

ArrayList list1 = new ArrayList();
ArrayList list2 = new ArrayList();

điền vào list1 theo bất kỳ cách nào bạn hiện đang có.

foreach(<type> obj in list1)
{
    list2.Add(obj);
}

4

Tùy chọn bạn muốn sao chép oldList vào một đối tượng ArrayList mới được gọi là newList

ArrayList<Object> newList = new ArrayList<>() ;

for (int i = 0 ; i<oldList.size();i++){
    newList.add(oldList.get(i)) ;
}

Hai danh sách này không rõ ràng, những thay đổi đối với một danh sách này không được phản ánh với danh sách kia.


4

Hãy thử ví dụ

     ArrayList<String> firstArrayList = new ArrayList<>();
            firstArrayList.add("One");
            firstArrayList.add("Two");
            firstArrayList.add("Three");
            firstArrayList.add("Four");
            firstArrayList.add("Five");
            firstArrayList.add("Six");
            //copy array list content into another array list
             ArrayList<String> secondArrayList=new ArrayList<>();
            secondArrayList.addAll(firstArrayList);
            //print all the content of array list
            Iterator itr = secondArrayList.iterator();
            while (itr.hasNext()) {
                System.out.println(itr.next());
            }

Trong đầu ra in như bên dưới

Một
hai
ba
bốn
năm
sáu

Chúng tôi cũng có thể thực hiện bằng cách sử dụng phương thức clone () được sử dụng để tạo bản sao chính xác

để thử bạn có thể thử như thế nào

 **ArrayList<String>secondArrayList = (ArrayList<String>) firstArrayList.clone();**
    And then print by using iterator
      **Iterator itr = secondArrayList.iterator();
                while (itr.hasNext()) {
                    System.out.println(itr.next());
                }**

3

Bạn cần đến clone()từng đối tượng. Constructorvà các phương pháp khác thực hiện sao chép nông. Bạn có thể thử phương pháp Collections.copy .


Collections.copy bị phá vỡ. Đầu tiên, nó gây hiểu lầm khi nói rằng nó sao chép các phần tử, trong khi nó chỉ tham chiếu chúng trong một danh sách mới. Thứ hai, bạn cần phải có một danh sách đích có kích thước không thấp hơn danh sách nguồn ...
ACV

1

Cách đơn giản để tạo bản sao sâu của danh sách gốc là thêm tất cả phần tử từ danh sách này sang danh sách khác.

ArrayList<Object> originalList = new ArrayList<Object>();
ArrayList<Object> duplicateList = new ArrayList<Object>();

for(Object o : originalList) {
    duplicateList.add(o);
}

Bây giờ, nếu bạn thực hiện bất kỳ thay đổi nào đối với originalList, nó sẽ không ảnh hưởng đến danh sách trùng lặp.


0

để sao chép một danh sách vào danh sách kia, bạn có thể sử dụng phương thức có tên là Collection.copy (myObject myTempObject). Bây giờ sau khi thực hiện các dòng mã này, bạn có thể thấy tất cả các giá trị danh sách trong myObject.


0

Sao chép một danh sách thành thứ hai khá đơn giản, bạn có thể thực hiện như sau: -

ArrayList<List1> list1= new ArrayList<>();
ArrayList<List1> list2= new ArrayList<>();
//this will your copy your list1 into list2
list2.addAll(list1);

0

Đây là một giải pháp để sao chép tất cả các đối tượng từ một arrayList sang một arrayList khác:

 ArrayList<Object> myObject = new ArrayList<Object>();
ArrayList<Object> myTempObject = new ArrayList<Object>();

myObject.addAll(myTempObject.subList(0, myTempObject.size()));

subList nhằm trả về một Danh sách với một loạt dữ liệu. vì vậy bạn có thể sao chép toàn bộ arrayList hoặc một phần của nó.


0

Giả sử bạn có hai danh sách mảng kiểu Chuỗi. Giống

ArrayList<String> firstArrayList ;//This array list is not having any data.

ArrayList<String> secondArrayList = new ArrayList<>();//Having some data.

Bây giờ chúng ta phải sao chép dữ liệu của mảng thứ hai vào danh sách mảng đầu tiên như thế này,

firstArrayList = new ArrayList<>(secondArrayList );

Làm xong!!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.