আমি কীভাবে একটি অ্যারেলিস্টের সামগ্রীগুলি অন্যটিতে অনুলিপি করব?


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

আমি কিভাবে থেকে মানগুলি ধরে রাখা না myTempObjectmyObjectজাভা ব্যবহার করছেন?


আপনি ব্যবহার করতে পারেন List.addAll। তবে আপনার যদি সমস্ত অবজেক্ট ধরে রাখতে হয় তবে অস্থায়ী তালিকাটি সাফ করা সত্যিই সম্পূর্ণ স্মৃতি মুছে ফেলবে না। কারণ আপনি কেবল রেফারেন্সগুলি সাফ করার চেষ্টা করছেন, যতক্ষণ অবজেক্ট আপনি সেগুলি রাখার চেষ্টা করছেন।
ভেশে গুরুং

যতদূর আমি জানি এই উত্তরটি এখনও বৈধ: stackoverflow.com/questions/715650/…
হোম

4
আপনি যা অর্জন করতে চাইছেন তা ব্যাখ্যা করা শক্ত। আপনার নিজের পরিস্থিতি ব্যাখ্যা করা দরকার।
ভেশে গুরুং

উত্তর:


141

আপনি এই জাতীয় কৌশল ব্যবহার করতে পারেন:

myObject = new ArrayList<Object>(myTempObject);

বা ব্যবহার

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

আপনি এখানে ক্লোন () পদ্ধতি সম্পর্কে কিছু তথ্য পেতে পারেন

তবে আপনার মনে রাখা উচিত, এই সমস্ত উপায়ে আপনাকে আপনার তালিকার একটি অনুলিপি দেবে, এর সমস্ত উপাদানই নয়। সুতরাং আপনি যদি অনুলিপিযুক্ত তালিকার কোনও একটি উপাদান পরিবর্তন করেন তবে এটি আপনার মূল তালিকায়ও পরিবর্তিত হবে।


7
জাভাতে মান অনুসারে নির্ধারণ করা এমন কিছু যা আদিম ধরণের (int, বাইট, চর, ইত্যাদি) এবং আক্ষরিক জন্য সংরক্ষিত। আপনি জাভাটিকে পরিষ্কারভাবে না বলুন যা থেকে উদ্ভূত কিছু অনুলিপি করার জন্য Objectএটি সর্বদা রেফারেন্সের সাহায্যে নির্ধারিত হবে। যাইহোক, clone()অগভীর অনুলিপি এবং এতে থাকা অনুলিপিটি কপি করবে না Objectsবরং তাদের উল্লেখ। : একটা গভীর-অনুলিপি কটাক্ষপাত করা আপনি করতে চান stackoverflow.com/questions/64036/...
PeterT

@ পিটারটি - জাভা কেবল কল দ্বারা কল করা হয় এবং মান অনুসারে নির্ধারিত হয়। অ-আদিম ধরণের ভেরিয়েবলগুলিতে রেফারেন্স মান থাকে যা নির্ধারিত বা পাস করা হয়।
ব্রায়ান রোচ

দয়া করে আমি কেন পারি না oldList = newList?
X09

4
@ X09 পুরাতনলিস্ট = নতুন তালিকা নতুন তালিকার রেফারেন্সটিকে ওল্ডলিস্টে অনুলিপি করবে, নতুন তালিকার কোনও পরিবর্তন পুরানো তালিকায়ও প্রতিফলিত হবে। এটি উদ্দেশ্যমূলক আচরণ নয়।
শ্রীকান্ত করুণাঘাট

42

আসলআরলিস্ট addAll (copyArrayList);

দয়া করে নোট করুন : অনুলিপি করতে অ্যাডএল () পদ্ধতিটি ব্যবহার করার সময়, অ্যারের তালিকার উভয় বিষয়বস্তু (মূলরাইলিস্ট এবং অনুলিপিআরলিলিস্ট) একই জিনিস বা সামগ্রীকে বোঝায় to সুতরাং আপনি যদি সেগুলির কোনও একটিতে সংশোধন করেন তবে অন্যরাও একই পরিবর্তনকে প্রতিফলিত করবে।

আপনি যদি এটি না চান তবে আপনার প্রতিটি উপাদান মূলআরলিস্ট থেকে অনুলিপি করতে হবে যেমন লুপের জন্য বা যখন ব্যবহার করার মতো while


4
অন্য তালিকাতে কীভাবে প্রভাব ফেলতে হয় তার অন্যান্য উপায় রয়েছে যা আমরা এটি পরিচালনা করতে পারি
মহেশ

@Mahesh - এই পড়ুন stackoverflow.com/questions/715650/...
KrishPrabakar

17

অ্যাসাইনমেন্ট অপারেটরের মাধ্যমে জাভাতে কোনও অন্তর্নিহিত অনুলিপি নেই। ভেরিয়েবলগুলিতে একটি রেফারেন্স মান (পয়েন্টার) থাকে এবং আপনি যখন ব্যবহার করেন =আপনি কেবল সেই মানটিই কপি করছেন।

আপনার বিষয়বস্তু সংরক্ষণ করার জন্য myTempObjectএটির একটি অনুলিপি তৈরি করতে হবে।

এটির ArrayListজন্য আরেকটি নির্মাণকারী ব্যবহার করে একটি নতুন তৈরি করে এটি করা যেতে পারে ArrayList:

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

সম্পাদনা: বোহেমিয়ান নীচের মন্তব্যে উল্লেখ করেছেন, আপনি কি এটি জিজ্ঞাসা করছেন? উপরের কাজটি করার মাধ্যমে উভয় ArrayList( myTempObjectএবং myObject) একই বস্তুর উল্লেখ থাকতে পারে । যদি আপনি আসলে একটি নতুন তালিকা চান যাতে এতে থাকা সামগ্রীর নতুন অনুলিপি থাকে myTempObjectতবে আপনাকে মূলটিতে প্রতিটি পৃথক বস্তুর একটি অনুলিপি তৈরি করতে হবেArrayList


4
এই ক্ষেত্রে এটি সূক্ষ্মভাবে কাজ করবে কারণ ডাকে ফোন clear()করার ArrayList myTempObjectথেরিনযুক্ত বস্তুর কোনও প্রভাব ফেলবে না। তিনি যদি তালিকায় থাকা সামগ্রীর নতুন অনুলিপিগুলি চান, তবে এটি অন্য গল্প, তবে আমি এই প্রশ্নটিকে জিজ্ঞাসা হিসাবে ব্যাখ্যা করেছি।
ব্রায়ান রোচ

আপনি জানেন আমি ঠিক বলেছি আমি প্রশ্নের ভুল ব্যাখ্যা করেছিলাম । তিনি উদ্বিগ্ন ছিলেন যে ক্লিয়ারিংয়ের মাধ্যমে অপরটি সাফ হবে। মন্তব্য মুছে ফেলা হয়েছে।
বোহেমিয়ান

@ বোহেমিয়ান - আমি মনে করি এটি একটি নিখুঁত মন্তব্য ছিল এবং আমি আমার পোস্টটি এটির প্রতিফলিত করার জন্য সম্পাদনা করেছি। আমি তার প্রশ্নটি পড়ার সময় ওপির উদ্দেশ্য হতে পারে তা বিবেচনা করি নি।
ব্রায়ান রোচ

@ ব্রায়ানরোচ কীভাবে একটি অ্যারেলিস্টের ভিতরে একটি অ্যারেলিস্টের অনুলিপি নিবেন।
অরুণ

8

একই সমস্যার মুখোমুখি হয়ে আমি নিজেই এসেছি।

অ্যারেলিস্ট 1 = অ্যারেলিস্ট 2 বললে উভয়কে একই জায়গায় পয়েন্ট করতে সেট করে তাই আপনি যদি উভয়ই ডেটা পরিবর্তন করেন এবং এইভাবে উভয় তালিকাগুলি সর্বদা একই থাকে।

একটি স্বাধীন তালিকায় মানগুলি অনুলিপি করতে আমি কেবল কন্টেন্টগুলি অনুলিপি করার জন্য ফোরচ ব্যবহার করেছি:

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

আপনি বর্তমানে যেভাবেই তালিকা 1 পূরণ করুন list

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

4

আপনি পুরানো তালিকাটি নতুন তালিকা হিসাবে পরিচিত নতুন অ্যারেলিস্ট অবজেক্টে অনুলিপি করতে চান তা মনে করুন

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 ভেঙ্গে গেছে. প্রথমত, এটি বিভ্রান্তিমূলক হয়ে বলে যে এটি উপাদানগুলির অনুলিপি করে, যেখানে এটি কেবলমাত্র একটি নতুন তালিকায় তাদের উল্লেখ করে। দ্বিতীয়ত, আপনার ইতিমধ্যে কোনও গন্তব্যের তালিকা থাকা দরকার যা উত্স তালিকার চেয়ে কম নয় ...
ACV

1

মূল তালিকার গভীর অনুলিপি তৈরির সোজা উপায় হ'ল এক উপাদান থেকে অন্য তালিকায় সমস্ত উপাদান যুক্ত করা।

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

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

এখন আপনি যদি আসললিস্টে কোনও পরিবর্তন করেন তবে এটি ডুপ্লিকেটলিস্টে প্রভাব ফেলবে না।


0

অন্য তালিকায় একটি তালিকা অনুলিপি করতে, আপনি সংগ্রহের তালিকা (মাইঅজেক্ট মাইটেম্পবজেক্ট) নামক পদ্ধতিটি ব্যবহার করতে পারেন। এই কোডের লাইনটি কার্যকর করার পরে আপনি মাইবজেক্টের সমস্ত তালিকা মান দেখতে পাবেন।


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

সম্পন্ন!!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.