ฉันจะคัดลอกเนื้อหาของ ArrayList หนึ่งไปยังอีกรายการหนึ่งได้อย่างไร


85

ฉันมีโครงสร้างข้อมูลบางส่วนและฉันต้องการใช้โครงสร้างแบบชั่วคราวและอีกแบบไม่ใช่แบบชั่วคราว

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();

ตอนนี้ปัญหาของหลักสูตรนี้myObjectเป็นเพียงแค่ชี้ไปที่จริงๆmyTempObjectและเมื่อmyTempObjectเคลียร์แล้วก็เป็นเช่นนั้นmyObjectเช่นนั้น

ฉันจะเก็บค่าจากวิธีการmyTempObjectในmyObjectการใช้ Java?


คุณสามารถใช้List.addAll. แต่ถ้าคุณต้องการเก็บวัตถุทั้งหมดการล้างรายการชั่วคราวจะไม่เป็นการล้างหน่วยความจำทั้งหมด เนื่องจากคุณพยายามล้างข้อมูลอ้างอิงเท่านั้นเท่าที่คุณพยายามเก็บไว้
Bhesh Gurung

เท่าที่ฉันรู้คำตอบนี้ยังใช้ได้: stackoverflow.com/questions/715650/…
home

2
ยากที่จะตีความว่าคุณพยายามบรรลุเป้าหมายอะไร คุณต้องอธิบายสถานการณ์ของคุณ
Bhesh Gurung

คำตอบ:


141

คุณสามารถใช้เคล็ดลับดังกล่าว:

myObject = new ArrayList<Object>(myTempObject);

หรือใช้

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

คุณสามารถรับข้อมูลบางอย่างเกี่ยวกับวิธีการ clone () ที่นี่

แต่คุณควรจำไว้ว่าวิธีการเหล่านี้ทั้งหมดจะทำให้คุณมีสำเนารายการของคุณไม่ใช่องค์ประกอบทั้งหมด ดังนั้นหากคุณเปลี่ยนองค์ประกอบอย่างใดอย่างหนึ่งในรายการที่คุณคัดลอกองค์ประกอบนั้นจะถูกเปลี่ยนแปลงในรายการเดิมของคุณด้วย


7
กำหนดตามค่าใน Java คือสิ่งที่สงวนไว้สำหรับประเภทดั้งเดิม (int, byte, char ฯลฯ ) และตัวอักษร เว้นแต่คุณจะบอกให้ Java คัดลอกสิ่งที่มาจากObjectมันอย่างชัดเจนจะกำหนดโดยการอ้างอิงเสมอ อย่างไรก็ตามclone()เป็นสำเนาตื้นและจะไม่คัดลอกที่มีอยู่Objectsแต่จะอ้างอิงถึงพวกเขา หากต้องการทำสำเนาลึกโปรดดูที่: stackoverflow.com/questions/64036/…
PeterT

@PeterT - Java เป็นเพียงโทรโดยและกำหนดโดยค่า ตัวแปรประเภท Non-primitive ประกอบด้วยค่าอ้างอิงที่กำหนดหรือส่งผ่าน
Brian Roach

ได้โปรดทำไมฉันทำoldList = newListไม่ได้?
X09

2
@ X09 oldList = newList จะคัดลอกการอ้างอิงของ newList ไปยัง oldList การเปลี่ยนแปลงใด ๆ ใน newList จะแสดงใน oldList ด้วย นั่นไม่ใช่พฤติกรรมที่ตั้งใจไว้
Sreekanth Karumanaghat

42

originalArrayList เพิ่มทั้งหมด (copyArrayList);

โปรดทราบ : เมื่อใช้เมธอด addAll () เพื่อคัดลอกเนื้อหาของรายการอาร์เรย์ทั้งสอง (originalArrayList และ copyArrayList) จะอ้างถึงวัตถุหรือเนื้อหาเดียวกัน ดังนั้นหากคุณแก้ไขอย่างใดอย่างหนึ่งสิ่งอื่น ๆ ก็จะแสดงถึงการเปลี่ยนแปลงเดียวกัน

หากคุณไม่ต้องการสิ่งนี้คุณต้องคัดลอกแต่ละองค์ประกอบจาก originalArrayList ไปยัง copyArrayList เช่นการใช้ for or while loop


1
วิธีการหยุดส่งผลกระทบไปยังรายการอื่นมีวิธีอื่นที่เราสามารถจัดการได้อย่างไร
Mahesh


17

ไม่มีการทำสำเนาโดยปริยายใน java ผ่านตัวดำเนินการกำหนด ตัวแปรประกอบด้วยค่าอ้างอิง (ตัวชี้) และเมื่อคุณใช้=คุณจะจัดการกับค่านั้นเท่านั้น

เพื่อที่จะรักษาเนื้อหาของ myTempObjectคุณจะต้องทำสำเนา

สามารถทำได้โดยการสร้างใหม่ArrayListโดยใช้ตัวสร้างที่ใช้ตัวสร้างอื่นArrayList:

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

แก้ไข:ตามที่โบฮีเมียนชี้ให้เห็นในความคิดเห็นด้านล่างนี่คือสิ่งที่คุณถามหรือไม่? เมื่อทำตามข้างต้นทั้งArrayLists ( myTempObjectและmyObject) จะมีการอ้างอิงถึงวัตถุเดียวกัน หากคุณต้องการรายการใหม่ที่มีสำเนาใหม่ของวัตถุที่มีอยู่myTempObjectคุณจะต้องทำสำเนาของแต่ละวัตถุในต้นฉบับArrayList


1
ในกรณีนี้มันจะทำงานได้ดีเช่นการโทรclear()บนArrayList myTempObjectจะไม่มีผลกระทบกับวัตถุที่มี Therin ถ้าเขาต้องการสำเนาใหม่ของวัตถุที่มีอยู่ในรายการนั่นเป็นอีกเรื่องหนึ่ง แต่นั่นไม่ใช่สิ่งที่ฉันตีความคำถามนี้ว่าถาม
Brian Roach

คุณรู้ว่าฉันคิดว่าคุณพูดถูก ฉันตีความคำถามผิด เขากังวลว่าการเคลียร์เรื่องหนึ่งจะทำให้อีกฝ่ายเคลียร์ ลบความคิดเห็นแล้ว
โบฮีเมียน

@ โบฮีเมียน - ฉันคิดว่ามันเป็นความคิดเห็นที่ยุติธรรมและฉันแก้ไขโพสต์ของฉันเพื่อแสดงถึงมัน ฉันไม่ได้คิดว่านั่นอาจเป็นเจตนาของ OP เมื่ออ่านคำถามของเขา
Brian Roach

@BrianRoach วิธีคัดลอก ArrayList ภายใน ArrayList
อรุณ

8

เจอปัญหานี้ในขณะที่ตัวเองกำลังเผชิญปัญหาเดียวกัน

การพูดว่า arraylist1 = arraylist2 ตั้งค่าให้ทั้งคู่ชี้ไปที่เดียวกันดังนั้นหากคุณแก้ไขการเปลี่ยนแปลงข้อมูลและทำให้ทั้งสองรายการยังคงเหมือนเดิม

ในการคัดลอกค่าลงในรายการอิสระฉันเพิ่งใช้ foreach เพื่อคัดลอกเนื้อหา:

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

กรอก list1 ในแบบที่คุณเป็นอยู่

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

4

สมมติว่าคุณต้องการคัดลอก oldList ไปยังวัตถุ ArrayList ใหม่ที่เรียกว่า newList

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

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

สองรายการนี้ขาดการเปลี่ยนแปลงการเปลี่ยนแปลงในรายการหนึ่งจะไม่สะท้อนไปยังอีกรายการหนึ่ง


4

ลองดูตัวอย่าง

     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());
            }

ในเอาต์พุตการพิมพ์ดังต่อไปนี้

หนึ่ง
สอง
สาม
สี่
ห้า
หก

เราสามารถทำได้โดยใช้clone ()ซึ่งใช้ในการสร้างสำเนาที่แน่นอน

สำหรับการลองนั้นคุณสามารถลองได้ตามต้องการ

 **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

คุณต้องการclone()วัตถุแต่ละชิ้น Constructorและวิธีอื่น ๆ ทำการคัดลอกแบบตื้น คุณอาจลอง ใช้วิธีCollections.copy


Collections.copy เสีย ประการแรกมันทำให้เข้าใจผิดโดยบอกว่ามันคัดลอกองค์ประกอบในขณะที่มันอ้างอิงเฉพาะในรายการใหม่เท่านั้น ประการที่สองคุณต้องมีรายการปลายทางที่มีขนาดไม่ต่ำกว่ารายการต้นทางอยู่แล้ว ...
ACV

1

วิธีที่ตรงไปตรงมาในการทำสำเนารายการต้นฉบับอย่างละเอียดคือการเพิ่มองค์ประกอบทั้งหมดจากรายการหนึ่งไปยังอีกรายการหนึ่ง

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

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

ตอนนี้หากคุณทำการเปลี่ยนแปลงใด ๆ กับ originalList มันจะไม่ส่งผลกระทบต่อ duplicateList


0

ในการคัดลอกรายการหนึ่งไปยังรายการอื่นคุณสามารถใช้วิธีการที่เรียกว่า Collection.copy (myObject myTempObject) ได้ในตอนนี้หลังจากดำเนินการบรรทัดโค้ดเหล่านี้แล้วคุณสามารถดูค่ารายการทั้งหมดใน myObject


0

การคัดลอกรายการหนึ่งเป็นวินาทีนั้นค่อนข้างง่ายคุณสามารถทำได้ดังนี้: -

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

0

นี่คือวิธีแก้ปัญหาในการคัดลอกวัตถุทั้งหมดจาก arrayList หนึ่งไปยังอีกรายการหนึ่ง:

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

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

รายการย่อยมีไว้เพื่อส่งคืนรายการที่มีช่วงข้อมูล เพื่อให้คุณสามารถคัดลอก arrayList ทั้งหมดหรือบางส่วนได้


0

สมมติว่าคุณมีรายการประเภท String สองรายการ ชอบ

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

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

ตอนนี้เราต้องคัดลอกข้อมูลของอาร์เรย์ที่สองไปยังรายการอาร์เรย์แรกเช่นนี้

firstArrayList = new ArrayList<>(secondArrayList );

เรียบร้อย !!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.