मैं एक 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जावा का उपयोग कर?


आप उपयोग कर सकते हैं List.addAll। लेकिन अगर आपको सभी वस्तुओं को बनाए रखने की आवश्यकता है, तो अस्थायी सूची को साफ़ करना वास्तव में बहुत सारी मेमोरी को साफ़ करने वाला नहीं है। क्योंकि आपके केवल संदर्भों को साफ़ करने की कोशिश कर रहे हैं, जहाँ तक आप उन्हें रखने की कोशिश कर रहे हैं।
भेश गुरुंग

जहाँ तक मुझे पता है कि यह उत्तर अभी भी मान्य है: stackoverflow.com/questions/715650/…
गृह

2
यह व्याख्या करना कठिन है कि आप वास्तव में क्या हासिल करने की कोशिश कर रहे हैं। आपको अपनी स्थिति स्पष्ट करने की आवश्यकता है।
भेश गुरुंग

जवाबों:


138

आप इस तरह की चाल का उपयोग कर सकते हैं:

myObject = new ArrayList<Object>(myTempObject);

या उपयोग करें

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

आप क्लोन () विधि के बारे में कुछ जानकारी यहाँ प्राप्त कर सकते हैं

लेकिन आपको याद रखना चाहिए, कि ये सभी तरीके आपको अपनी सूची की एक प्रति देंगे , न कि इसके सभी तत्वों की। इसलिए यदि आप अपनी कॉपी की गई सूची में किसी एक तत्व को बदलते हैं, तो यह आपकी मूल सूची में भी बदल जाएगा।


7
जावा में मान द्वारा असाइन किया गया कुछ ऐसा है जो आदिम प्रकार (इंट, बाइट, चार, आदि) और शाब्दिक के लिए आरक्षित है। जब तक आप स्पष्ट रूप से जावा को कुछ ऐसी चीज़ की नकल करने के लिए नहीं कहेंगे, जो Objectउससे प्राप्त होती है, वह हमेशा संदर्भ द्वारा बताएगी । वैसे clone()एक उथली प्रतिलिपि है और निहित की नकल नहीं करेगा Objects, बल्कि उनके संदर्भ। यदि आप एक गहरी-प्रतिलिपि बनाना चाहते हैं, तो इस पर एक नज़र डालें: stackoverflow.com/questions/64036/…
पीटरटी

@PeterT - जावा केवल मूल्य के आधार पर कॉल और असाइन करता है। गैर-आदिम प्रकार के चर में संदर्भ मान होते हैं जिन्हें असाइन या पास किया जाता है।
ब्रायन रोच

कृपया मुझे क्यों नहीं कर सकते oldList = newList?
X09

2
@ X09 पुराने लेलिस्ट = न्यू ललिस्ट, न्यूलिस्ट के संदर्भ को पुराने लिस्ट में कॉपी करेंगे, न्यूलिस्ट में कोई भी परिवर्तन पुराने लिस्ट में भी दिखाई देगा। वह अभीष्ट व्यवहार नहीं है।
श्रीकांत करुमनघाट

42

originalArrayList। addAll (copyArrayList);

कृपया ध्यान दें : कॉपी करने के लिए addAll () विधि का उपयोग करते समय, दोनों सरणी सूचियों (ओरिजनल एरेस्टलिस्ट और कॉपीअरेस्टलिस्ट) की सामग्री एक ही ऑब्जेक्ट या सामग्री को संदर्भित करती है। इसलिए यदि आप उनमें से किसी एक को संशोधित करते हैं तो दूसरा भी उसी परिवर्तन को प्रतिबिंबित करेगा।

यदि आप ऐसा नहीं करते हैं, तो आपको मूल तत्व से प्रत्येक तत्व को copyArrayList पर कॉपी करने की आवश्यकता होती है, जैसे कि for for या जबकि लूप का उपयोग करना।


1
किसी अन्य सूची पर प्रभाव को कैसे रोका जाए, कोई और तरीका है जिससे हम इसे संभाल सकते हैं
महेश

@Mahesh - यह उल्लेख stackoverflow.com/questions/715650/...
KrishPrabakar

17

असाइनमेंट ऑपरेटर के माध्यम से जावा में कोई अंतर्निहित प्रतियां नहीं हैं। चर में एक संदर्भ मान (पॉइंटर) होता है और जब आप उपयोग =करते हैं तो आप केवल उस मूल्य का मुकाबला करते हैं।

की सामग्री को संरक्षित करने के लिए myTempObject आपको इसकी एक प्रति बनाने की आवश्यकता होगी।

यह एक और बनाने वाले के ArrayListउपयोग से एक नया निर्माण करके किया जा सकता है ArrayList:

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

संपादित करें: जैसा कि बोहेमियन नीचे टिप्पणी में बताते हैं, क्या यह आप पूछ रहे हैं? उपरोक्त करने से, दोनों ArrayLists ( myTempObjectऔर myObject) में समान वस्तुओं के संदर्भ होंगे । यदि आप वास्तव में एक नई सूची चाहते हैं जिसमें शामिल वस्तुओं की नई प्रतियां हैं myTempObjectतो आपको मूल में प्रत्येक व्यक्तिगत वस्तु की एक प्रति बनाने की आवश्यकता होगीArrayList


1
इस मामले में यह बुला रूप में ठीक काम करेगा clear()पर ArrayList myTempObjectपर वस्तुओं थेरिन निहित कोई असर नहीं होगा। यदि वह सूची में शामिल वस्तुओं की नई प्रतियां चाहता है, तो यह एक और कहानी है, लेकिन यह नहीं है कि मैंने इस प्रश्न को पूछने के रूप में व्याख्या की थी।
ब्रायन रोच

तुम्हें पता है कि मुझे लगता है कि तुम सही हो। मैंने प्रश्न की गलत व्याख्या की। वह चिंतित था कि एक समाशोधन दूसरे को साफ करेगा। टिप्पणी हटा दी गई।
बोहेमियन

@ बोहेमियन - मुझे लगता है कि यह एक उचित टिप्पणी थी और मैंने इसे प्रतिबिंबित करने के लिए अपनी पोस्ट को संपादित किया। मैंने यह नहीं सोचा कि उनके प्रश्न को पढ़ते समय ओपी की मंशा हो सकती है।
ब्रायन रोच

@BrianRoach एक ArrayList के अंदर एक ArrayList की प्रतिलिपि कैसे लें।
अरुण

8

खुद इस मुद्दे का सामना करते हुए इस पार आया।

Arraylist1 = arraylist2 कहना उन दोनों को एक ही स्थान पर इंगित करने के लिए सेट करता है, इसलिए यदि आप या तो डेटा अलर्ट में परिवर्तन करते हैं और इस प्रकार दोनों सूचियाँ हमेशा समान रहती हैं।

एक स्वतंत्र सूची में मूल्यों को कॉपी करने के लिए मैंने केवल सामग्री की प्रतिलिपि बनाने के लिए फ़ॉर्च का उपयोग किया:

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

जो भी वर्तमान में आप हैं, उनमें list1 भरें।

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

4

यह मान लें कि आप पुराने कलाकार को एक नए 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());
            }

नीचे के रूप में प्रिंट आउटपुट में

एक
दो
तीन
चार
पांच
छक्के

हम क्लोन () पद्धति का उपयोग करके भी कर सकते हैं जिसके लिए सटीक प्रतिलिपि बनाने के लिए उपयोग किया जाता है

उस प्रयास के लिए आप इस तरह की कोशिश कर सकते हैं

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

अब यदि आप ओरिजनलिस्ट में कोई बदलाव करते हैं तो यह डुप्लिकेटिस्ट पर प्रभाव नहीं डालेगा।


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<Object> myObject = new ArrayList<Object>();
ArrayList<Object> myTempObject = new ArrayList<Object>();

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

उप-सूची का उद्देश्य डेटा की एक सीमा के साथ एक सूची वापस करना है। तो आप पूरे सरणी या उसके भाग की प्रतिलिपि बना सकते हैं।


0

मान लीजिए आपके पास स्ट्रिंग प्रकार की दो सरणी सूची है। पसंद

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

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

अब हमें दूसरी सरणी के डेटा को इस तरह पहली सरणी सूची में कॉपी करना होगा,

firstArrayList = new ArrayList<>(secondArrayList );

किया हुआ!!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.