অ্যারেলিস্ট কীভাবে ক্লোন করবেন এবং এর বিষয়বস্তুগুলি ক্লোন করবেন?


273

আমি ArrayListজাভাতে কীভাবে কোনও ক্লোন করতে এবং এর আইটেমগুলি ক্লোন করতে পারি ?

উদাহরণস্বরূপ আমার আছে:

ArrayList<Dog> dogs = getDogs();
ArrayList<Dog> clonedList = ....something to do with dogs....

এবং আমি আশা করব যে clonedListকুকুর তালিকার মধ্যে থাকা বস্তুগুলি একই নয়।


উত্তর:


199

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

public static List<Dog> cloneList(List<Dog> list) {
    List<Dog> clone = new ArrayList<Dog>(list.size());
    for (Dog item : list) clone.add(item.clone());
    return clone;
}

এটি কাজ করার জন্য, স্পষ্টতই, আপনাকে ইন্টারফেসটি Dogপ্রয়োগ করতে Cloneableএবং clone()পদ্ধতিটিকে ওভাররাইড করার জন্য আপনার ক্লাস করতে হবে ।


19
যদিও আপনি এটি উদারভাবে করতে পারবেন না। ক্লোন () ক্লোনযোগ্য ইন্টারফেসের অংশ নয়।
মাইকেল ম্যাইইয়ার্স

13
তবে ক্লোন () অবজেক্টে সুরক্ষিত, যাতে আপনি এটি অ্যাক্সেস করতে পারবেন না। সেই কোডটি সংকলনের চেষ্টা করুন।
মাইকেল ময়র্স

5
সমস্ত শ্রেণি অবজেক্টকে প্রসারিত করে, তাই তারা ক্লোন () কে ওভাররাইড করতে পারে। এটিই ক্লোনেবলের জন্য!
স্টেফান202

2
এটি একটি ভাল উত্তর। ক্লোনেবেল আসলে একটি ইন্টারফেস। তবে এমমিয়ার্সের একটি বিন্দু রয়েছে যে ক্লোন () পদ্ধতিটি বস্তু শ্রেণিতে ঘোষিত একটি সুরক্ষিত পদ্ধতি। আপনাকে আপনার কুকুর শ্রেণিতে এই পদ্ধতিটি ওভাররাইড করতে হবে এবং ক্ষেত্রগুলির ম্যানুয়াল অনুলিপিটি নিজেই করতে হবে।
জোসে

3
আমি বলছি, একটি কারখানা বা বিল্ডার তৈরি করুন, বা এমনকি একটি স্থিতিশীল পদ্ধতি, এটি কুকুরের উদাহরণ গ্রহণ করবে এবং ম্যানুয়ালি ক্ষেত্রগুলিকে একটি নতুন উদাহরণে অনুলিপি করবে এবং সেই নতুন উদাহরণটি ফিরে আসবে।
জোসে

196

আমি ব্যক্তিগতভাবে কুকুরের জন্য একজন কনস্ট্রাক্টর যুক্ত করব:

class Dog
{
    public Dog()
    { ... } // Regular constructor

    public Dog(Dog dog) {
        // Copy all the fields of Dog.
    }
}

তারপরে কেবল পুনরাবৃত্তি করুন (যেমন ভার্খানের উত্তরে দেখানো হয়েছে):

public static List<Dog> cloneList(List<Dog> dogList) {
    List<Dog> clonedList = new ArrayList<Dog>(dogList.size());
    for (Dog dog : dogList) {
        clonedList.add(new Dog(dog));
    }
    return clonedList;
}

আমি এর সুবিধাটি খুঁজে পাচ্ছি যে আপনার জাভাতে ভাঙ্গা ক্লোনিয়েবল স্টাফ দিয়ে ঘুরিয়ে নেওয়ার দরকার নেই। আপনি জাভা সংগ্রহগুলি যেভাবে অনুলিপি করেছেন তাও এটি মেলে।

অন্য একটি বিকল্প হতে পারে আপনার নিজের আইসিএলনেয়েবল ইন্টারফেসটি লিখুন এবং এটি ব্যবহার করুন। এইভাবে আপনি ক্লোনিংয়ের জন্য একটি জেনেরিক পদ্ধতি লিখতে পারেন।


আপনি কি ডগের সমস্ত ক্ষেত্রে অনুলিপি সহ আরও সুনির্দিষ্ট হতে পারেন। আমি
সত্যই

কোনও অনির্ধারিত অবজেক্টের জন্য (কুকুরের বদলে) ফাংশনটি লেখা কি সম্ভব?
টোবি জি

@TobiG। তুমি কী বলতে চাচ্ছ আমি বুঝতে পারছি না। আপনি চান cloneList(List<Object>)বা না Dog(Object)?
সিডিএমকেই

@cdmckay ওয়ান ফাংশন যা ক্লোনলিস্ট (তালিকা <ওজেক্ট>), ক্লোনলিস্ট (তালিকা <ডোগ>) এবং ক্লোনলিস্ট (তালিকা <ct>) এর জন্য কাজ করে। তবে আপনি যে জেনেরিক কনস্ট্রাক্টরকে কল করতে পারবেন না আমার ধারণা ...?
টবি জি

@TobiG। একটি সাধারণ ক্লোনিং ফাংশন মত তারপর? এই প্রশ্নটি আসলে কী তা নয়।
সিডিএমকেই

143

সমস্ত মান সংগ্রহের অনুলিপি নির্মাণকারী রয়েছে। তাদের ব্যাবহার করুন.

List<Double> original = // some list
List<Double> copy = new ArrayList<Double>(original); //This does a shallow copy

clone()বেশ কয়েকটি ভুল দ্বারা ডিজাইন করা হয়েছিল ( এই প্রশ্নটি দেখুন ), তাই এড়ানো ভাল।

থেকে কার্যকর জাভা 2nd সংস্করণ , আইটেম 11: ওভাররাইড ক্লোন judiciously

ক্লোনয়েবলের সাথে সম্পর্কিত সমস্ত সমস্যাগুলি দেওয়া, এটি বলা নিরাপদ যে অন্য ইন্টারফেসগুলি এটি প্রসারিত করা উচিত নয় এবং উত্তরাধিকারের জন্য ডিজাইন করা ক্লাসগুলি (আইটেম 17) এটি প্রয়োগ করা উচিত নয়। এর অনেক ত্রুটিগুলির কারণে, কিছু বিশেষজ্ঞ প্রোগ্রামার কেবল ক্লোন পদ্ধতিটি কখনই ওভাররাইড না করে এবং এটিকে অনুলিপি না করে কেবল এটিকে প্রার্থনা না করে বেছে নেয়। যদি আপনি উত্তরাধিকারের জন্য কোনও শ্রেণি নকশা করেন তবে সচেতন হন যে আপনি যদি ভাল আচরণযুক্ত সুরক্ষিত ক্লোন পদ্ধতি সরবরাহ না করা বেছে নেন তবে সাবক্লাসগুলির পক্ষে ক্লোনযোগ্য কার্যকর করা অসম্ভব হয়ে উঠবে।

এই বইটি অনুলিপি নির্মাণকারীদের ক্লোনযোগ্য / ক্লোনার ওপরে থাকা বহুবিধ সুবিধাও বর্ণনা করে।

  • তারা ঝুঁকি-ঝুঁকির বহিরাগত ভাষাগুলি তৈরির প্রক্রিয়াতে নির্ভর করে না
  • তারা পাতলা নথিভুক্ত কনভেনশনগুলিতে অযোগ্য প্রয়োগের আনুগত্যের দাবি করে না
  • চূড়ান্ত ক্ষেত্রগুলির যথাযথ ব্যবহারের সাথে তারা বিরোধ করে না
  • তারা অপ্রয়োজনীয় পরীক্ষিত ব্যতিক্রম ছুঁড়ে না ফেলে
  • তাদের কস্টের দরকার নেই।

অনুলিপি নির্মাণকারীদের ব্যবহারের আরেকটি সুবিধা বিবেচনা করুন: মনে করুন আপনার একটি রয়েছে HashSet sএবং আপনি এটি অনুলিপি করতে চান TreeSet। ক্লোন পদ্ধতিটি এই কার্যকারিতাটি দিতে পারে না, তবে রূপান্তর কনস্ট্রাক্টরের সাথে এটি সহজ new TreeSet(s)


84
আমি যতটা সচেতন, মান সংগ্রহের অনুলিপি নির্মাণকারীরা অগভীর অনুলিপি তৈরি করেন , গভীর অনুলিপিটি তৈরি করে না । এখানে জিজ্ঞাসিত প্রশ্নটি একটি গভীর অনুলিপি উত্তরের সন্ধান করে।
আব্দুল

19
এটি সহজভাবে ভুল, অনুলিপি কর্ণধাররা একটি অগভীর অনুলিপি করেন - পুরো প্রশ্নের
উত্সব

1
এই উত্তরের বিষয়ে সঠিকটি হ'ল যদি আপনি তালিকার মধ্যে থাকা বস্তুগুলিকে পরিবর্তন না করে থাকেন তবে আইটেম যুক্ত বা অপসারণ উভয় তালিকা থেকে তাদের সরিয়ে দেয় না। এটি সাধারণ কার্যভার হিসাবে অগভীর নয় ।
নওমেনন

42

জাভা 8 ইলিমেন্ট কুকুরগুলিতে কপি কন্সট্রাক্টর বা ক্লোন পদ্ধতিটি মার্জিতভাবে এবং সংক্ষিপ্তভাবে কল করার জন্য একটি নতুন উপায় সরবরাহ করে: স্ট্রিম , ল্যাম্বডাস এবং সংগ্রহকারী

অনুলিপি নির্মাণকারী:

List<Dog> clonedDogs = dogs.stream().map(Dog::new).collect(toList());

অভিব্যক্তিটিকে Dog::newএকটি পদ্ধতি রেফারেন্স বলা হয় । এটি একটি ফাংশন অবজেক্ট তৈরি করে Dogযা একটি কনস্ট্রাক্টরকে কল করে যার উপর অন্য কুকুরটিকে যুক্তি হিসাবে গ্রহণ করে।

ক্লোন পদ্ধতি [1]:

List<Dog> clonedDogs = dogs.stream().map(d -> d.clone()).collect(toList());

ArrayListফলাফল হিসাবে একটি পেয়ে

অথবা, যদি আপনাকে ArrayListফিরে পেতে হয় (তবে আপনি পরে এটি সংশোধন করতে চান):

ArrayList<Dog> clonedDogs = dogs.stream().map(Dog::new).collect(toCollection(ArrayList::new));

জায়গায় তালিকা আপডেট করুন

আপনার যদি তালিকার মূল বিষয়বস্তু রাখার দরকার না হয় তবে আপনি dogsপরিবর্তে replaceAllপদ্ধতিটি ব্যবহার করতে পারেন এবং তালিকায় জায়গাটি আপডেট করতে পারেন :

dogs.replaceAll(Dog::new);

সমস্ত উদাহরণ ধরে নেওয়া import static java.util.stream.Collectors.*;


জন্য কালেক্টর ArrayListগুলি

শেষ উদাহরণ থেকে সংগ্রহকারী একটি ব্যবহার পদ্ধতিতে তৈরি করা যেতে পারে। যেহেতু এটি করা যেমন একটি সাধারণ জিনিস আমি ব্যক্তিগতভাবে এটি সংক্ষিপ্ত এবং সুন্দর হতে পছন্দ করি। এটার মত:

ArrayList<Dog> clonedDogs = dogs.stream().map(d -> d.clone()).collect(toArrayList());

public static <T> Collector<T, ?, ArrayList<T>> toArrayList() {
    return Collectors.toCollection(ArrayList::new);
}

[1] দ্রষ্টব্য CloneNotSupportedException:

এই সমাধানটির জন্য কাজ করার cloneপদ্ধতিটি Dog অবশ্যই ঘোষণা করে না যে এটি ছোঁড়ে CloneNotSupportedException। কারণটি হ'ল যুক্তিটি mapকোনও চেক করা ব্যতিক্রম নিক্ষেপ করার অনুমতি নেই।

এটার মত:

    // Note: Method is public and returns Dog, not Object
    @Override
    public Dog clone() /* Note: No throws clause here */ { ...

তবে এটি কোনও বড় সমস্যা হওয়া উচিত নয়, যেহেতু এটি সর্বোত্তম অনুশীলন। ( উদাহরণস্বরূপ কার্যকর জাভা এই পরামর্শ দেয়))

এটি উল্লেখ করার জন্য গুস্তাভোর ধন্যবাদ


পুনশ্চ:

আপনি যদি এটি সুন্দর দেখতে পান তবে পরিবর্তে একই জিনিসটি করতে আপনি পদ্ধতিটির রেফারেন্স সিনট্যাক্সটি ব্যবহার করতে পারেন:

List<Dog> clonedDogs = dogs.stream().map(Dog::clone).collect(toList());

আপনি কি ডগ (ডি) অনুলিপি নির্মাণকারী যেখানে এইভাবে করার কোনও কার্যকারিতা প্রভাব দেখতে পাচ্ছেন? List<Dog> clonedDogs = new ArrayList<>(); dogs.stream().parallel().forEach(d -> clonedDogs.add(new Dog(d)));
সৌরভ জিন্তুরকার

1
@ সৌরভ জিন্তুরকার: আপনার সংস্করণ থ্রেড-নিরাপদ নয় এবং সমান্তরাল স্ট্রিম ব্যবহার করা উচিত নয়। এর কারণ parallelকল clonedDogs.addএকই সাথে একাধিক থ্রেড থেকে কল আসে। ব্যবহৃত সংস্করণগুলি collectথ্রেড-নিরাপদ safe এটি স্ট্রিম লাইব্রেরির ক্রিয়ামূলক মডেলের অন্যতম সুবিধা, সমান্তরাল স্ট্রিমের জন্য একই কোড ব্যবহার করা যেতে পারে।
Lii

1
@ সৌরভ জিন্টুরকার: এছাড়াও, সংগ্রহের কাজটি দ্রুত। এটি আপনার সংস্করণটির মতো একই কাজ করে তবে সমান্তরাল স্ট্রিমগুলির জন্যও কাজ করে। উদাহরণস্বরূপ, অ্যারের তালিকার পরিবর্তে সমবর্তী সারির ব্যবহার করে আপনি আপনার সংস্করণটি ঠিক করতে পারেন তবে আমি প্রায় নিশ্চিত যে এটি আরও ধীর হবে।
লিই

যখনই আমি তোমার সমাধান ব্যবহারের চেষ্টা আমি একজন পেতে Unhandled exception type CloneNotSupportedExceptionউপর d.clone()। ব্যতিক্রম ঘোষণা করা বা ধরা এটি সমাধান করে না।
গুস্তাভো

@ গুস্তাভো: এটি প্রায় অবশ্যই কারণ আপনি যে বস্তুকে ক্লোন করছেন, ( Dogএই উদাহরণে) ক্লোনিং সমর্থন করে না। আপনি কি নিশ্চিত যে এটি Clonableইন্টারফেসটি প্রয়োগ করে ?
লিই

28

ম্যানুয়ালি পুনরাবৃত্তি না করে তিনটি উপায় আছে,

1 কনস্ট্রাক্টর ব্যবহার করে

ArrayList<Dog> dogs = getDogs();
ArrayList<Dog> clonedList = new ArrayList<Dog>(dogs);

2 ব্যবহার addAll(Collection<? extends E> c)

ArrayList<Dog> dogs = getDogs();
ArrayList<Dog> clonedList = new ArrayList<Dog>();
clonedList.addAll(dogs);

3 প্যারামিটার addAll(int index, Collection<? extends E> c)সহ পদ্ধতি ব্যবহার intকরা

ArrayList<Dog> dogs = getDogs();
ArrayList<Dog> clonedList = new ArrayList<Dog>();
clonedList.addAll(0, dogs);

নোট: অপারেশন চলমান অবস্থায় নির্দিষ্ট সংগ্রহটি সংশোধন করা হলে এই ক্রিয়াকলাপগুলির আচরণ অপরিজ্ঞাত হবে।


49
দয়া করে মনে রাখবেন না যে এই 3
টির সবগুলিই

8
এটি কোনও গভীর ক্লোন নয়, এই দুটি তালিকাগুলি একই জিনিসগুলি ধরে রেখেছে, কেবলমাত্র রেফারেন্সগুলি অনুলিপি করেছে তবে কুকুর অবজেক্ট, একবার আপনি উভয় তালিকায় পরিবর্তন করেছেন, পরবর্তী তালিকার একই পরিবর্তন হবে। donno y এত upvotes।
সওরকিডো

1
@ নিসন.জেড সমস্ত পদ্ধতি তালিকাটির একটি গভীর অনুলিপি এবং তালিকার উপাদানটির অগভীর অনুলিপি তৈরি করে। আপনি যদি তালিকার কোনও উপাদানটি পরিবর্তন করেন তবে পরিবর্তনটি অন্য তালিকার দ্বারা প্রতিফলিত হবে তবে আপনি যদি তালিকার একটিতে পরিবর্তন করেন (উদাহরণস্বরূপ কোনও বস্তু অপসারণ), অন্য তালিকাটি অপরিবর্তিত থাকবে।
আলেসান্দ্রো তেরুজি

17

আমি মনে করি বর্তমান সবুজ উত্তরটি খারাপ , আপনি কেন জিজ্ঞাসা করতে পারেন?

  • এটিতে প্রচুর কোড যুক্ত করা প্রয়োজন
  • আপনার সমস্ত তালিকা তালিকার জন্য অনুলিপি করা এবং এটি করা দরকার

সিরিয়ালাইজেশনটি যেভাবে ইমো খারাপ, আপনি পুরো জায়গা জুড়ে সিরিয়ালাইজযোগ্য যোগ করতে পারেন।

তাহলে সমাধান কি:

জাভা ডিপ-ক্লোনিং লাইব্রেরি ক্লোনিং লাইব্রেরি একটি ছোট, ওপেন সোর্স (অ্যাপাচি লাইসেন্স) জাভা লাইব্রেরি যা ডিপ ক্লোনিজ অবজেক্টগুলি। বস্তুগুলির ক্লোনযোগ্য ইন্টারফেস প্রয়োগ করতে হবে না। কার্যকরভাবে, এই গ্রন্থাগারটি কোনও জাভা বস্তুর ক্লোন করতে পারে। এটি ক্যাশে বাস্তবায়নের ক্ষেত্রে ব্যবহার করা যেতে পারে আপনি যদি ক্যাশেড অবজেক্টটি পরিবর্তন করতে না চান বা যখনই আপনি অবজেক্টগুলির একটি গভীর অনুলিপি তৈরি করতে চান না।

Cloner cloner=new Cloner();
XX clone = cloner.deepClone(someObjectOfTypeXX);

Https://github.com/kostaskougios/cloning এ এটি পরীক্ষা করে দেখুন


8
এই পদ্ধতির সাথে একটি সতর্কতা হ'ল এটি প্রতিবিম্বটি ব্যবহার করে, যা ভার্খানের সমাধানের চেয়ে বেশ খানিকটা ধীর হতে পারে।
সিডিএমকেই

6
আমি প্রথম পয়েন্টটি বুঝতে পারি না "এটির জন্য প্রচুর কোড প্রয়োজন"। আপনি যে লাইব্রেরির কথা বলছেন তার আরও কোড দরকার। আপনি এটি কোথায় রাখেন এটি কেবল বিষয়। অন্যথায় আমি এই জাতীয় জিনিসটির জন্য একটি বিশেষ গ্রন্থাগারকে সম্মতি দিচ্ছি ..
নওফাল

8

আমি একটি উপায় খুঁজে পেয়েছি, আপনি তালিকাটি সিরিয়ালাইজ / আনসিরিয়ালাইজ করতে json ব্যবহার করতে পারেন। সিরিয়ালাইজড তালিকার আনসরিয়ালাইজড যখন মূল অবজেক্টের কোনও রেফারেন্স থাকে না।

গসন ব্যবহার:

List<CategoryModel> originalList = new ArrayList<>(); // add some items later
String listAsJson = gson.toJson(originalList);
List<CategoryModel> newList = new Gson().fromJson(listAsJson, new TypeToken<List<CategoryModel>>() {}.getType());

আপনি জ্যাকসন এবং অন্য কোনও জেসন লাইব্রেরি ব্যবহার করে এটি করতে পারেন।


1
আমি জানি না কেন লোকেরা এই উত্তরটিকে অগ্রাহ্য করেছে। অন্যান্য উত্তরের ক্লোন () প্রয়োগ করতে হবে বা নতুন লাইব্রেরি অন্তর্ভুক্ত করার জন্য তাদের নির্ভরতা পরিবর্তন করতে হবে। তবে জেএসনের গ্রন্থাগারটির বেশিরভাগ প্রকল্প ইতিমধ্যে অন্তর্ভুক্ত থাকতে পারে। আমি এই জন্য upvated।
সতীশ

1
@ স্যাটিশ হ্যাঁ, এটিই কেবলমাত্র একটি উত্তর যা আমাকে সহায়তা করেছিল, আমি নিশ্চিত নই যে অন্যদের মধ্যে কী হয়েছে, তবে আমি যা কিছু করি না কেন, নকল নির্মাণকারীর ক্লোন বা ব্যবহার করি না কেন, আমার আসল তালিকাটি আপডেট হওয়ার জন্য ব্যবহৃত হয়েছিল, তবে এইভাবে তা হয় না , তাই লেখক ধন্যবাদ!
প্যারাগ পওয়ার

ঠিক আছে, এটা সত্য যে জ্ঞানের পক্ষে খাঁটি জাভা জবাব নয়, এই সমস্যাটি দ্রুত সমাধানের জন্য একটি কার্যকর সমাধান
marcRDZ

দুর্দান্ত হ্যাক, সময় বরাদ্দ সাশ্রয়
এমএক্সএমএল

6

আমি এই বিকল্পটি সর্বদা ব্যবহার করেছি:

ArrayList<Dog> clonedList = new ArrayList<Dog>(name_of_arraylist_that_you_need_to_Clone);

2

আপনাকে ArrayListহাত দ্বারা ক্লোন করতে হবে (এটির উপরে পুনরাবৃত্তি করে এবং প্রতিটি উপাদানকে একটি নতুন করে অনুলিপি করে ArrayList), কারণ clone()এটি আপনার জন্য করবে না। এর কারণ হ'ল মেইনগুলিতে থাকা অবজেক্টগুলি নিজেরাই ArrayListপ্রয়োগ করতে পারে না Clonable

সম্পাদনা : ... এবং ভারখানের কোডটি ঠিক তাই করে।


1
এমনকি যদি তারা তা করেও, প্রতিচ্ছবি ব্যতীত ক্লোন () কে অ্যাক্সেস করার কোনও উপায় নেই এবং যাইহোক এটি সফল হওয়ার গ্যারান্টিযুক্ত নয়।
মাইকেল

1

একটি বাজে উপায় হ'ল প্রতিবিম্ব সহ এটি করা। এরকম কিছু আমার জন্য কাজ করেছিল।

public static <T extends Cloneable> List<T> deepCloneList(List<T> original) {
    if (original == null || original.size() < 1) {
        return new ArrayList<>();
    }

    try {
        int originalSize = original.size();
        Method cloneMethod = original.get(0).getClass().getDeclaredMethod("clone");
        List<T> clonedList = new ArrayList<>();

        // noinspection ForLoopReplaceableByForEach
        for (int i = 0; i < originalSize; i++) {
            // noinspection unchecked
            clonedList.add((T) cloneMethod.invoke(original.get(i)));
        }
        return clonedList;
    } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
        System.err.println("Couldn't clone list due to " + e.getMessage());
        return new ArrayList<>();
    }
}

ঝরঝরে ও বাজে কৌশল! একটি সম্ভাব্য সমস্যা: যদি originalবিভিন্ন শ্রেণীর অবজেক্ট থাকে তবে আমি মনে করি cloneMethod.invokeএটি কোনও ব্যতিক্রম ব্যর্থ হবে যখন এটি ভুল ধরণের অবজেক্টের সাথে ডাকা হবে। যার কারণে Methodপ্রতিটি বস্তুর জন্য একটি নির্দিষ্ট ক্লোন পুনরুদ্ধার করা ভাল । অথবা ক্লোন পদ্ধতিটি ব্যবহার করুন Object(তবে যেহেতু এটি সুরক্ষিত যা আরও বেশি ক্ষেত্রে ব্যর্থ হতে পারে)।
লি

এছাড়াও, আমি মনে করি খালি তালিকার পরিবর্তে ক্যাচ-ক্লজে রানটাইম ব্যতিক্রম ছুঁড়ে দেওয়া ভাল।
লি

1
List<Dog> dogs;
List<Dog> copiedDogs = dogs.stream().map(dog -> SerializationUtils.clone(dog)).Collectors.toList());

এটি প্রতিটি কুকুরকে গভীরভাবে অনুলিপি করবে


0

অন্যান্য পোস্টারগুলি সঠিক: আপনাকে তালিকাটি পুনরাবৃত্তি করতে হবে এবং একটি নতুন তালিকায় অনুলিপি করতে হবে।

তবে ... তালিকার অবজেক্টগুলি যদি অপরিবর্তনীয় হয় - আপনার সেগুলি ক্লোন করার দরকার নেই। যদি আপনার অবজেক্টে একটি জটিল অবজেক্ট গ্রাফ থাকে - সেগুলিও অপরিবর্তনীয় হতে হবে।

অপরিবর্তনীয়তার অপর সুবিধা হ'ল তারা থ্রেডসেইফও রয়েছে।


0

জেনেরিক টেম্পলেট প্রকারটি ব্যবহার করে এখানে একটি সমাধান দেওয়া হয়েছে:

public static <T> List<T> copyList(List<T> source) {
    List<T> dest = new ArrayList<T>();
    for (T item : source) { dest.add(item); }
    return dest;
}

জেনেরিক্স ভাল তবে প্রশ্নের উত্তর দেওয়ার জন্য আপনার আইটেমগুলি ক্লোন করতে হবে। দেখুন stackoverflow.com/a/715660/80425
ডেভিড Snabel-Caunt

0

আপনার জন্য ক্লোন () পদ্ধতিকে ওভাররাইড করে objects

class You_class {

    int a;

    @Override
    public You_class clone() {
        You_class you_class = new You_class();
        you_class.a = this.a;
        return you_class;
    }
}

এবং ভেক্টর আপত্তি বা অ্যারেআইলিস্ট আপত্তিটির জন্য .ক্লোন () কল করুন ...


0

Commons-lang-2.3.jar ব্যবহার করে জাভির সেই লাইব্রেরিটিকে ক্লোন তালিকা করতে সহজ উপায়

লিংক ডাউনলোড কমন্স-ল্যাং-২.৩.জার

ব্যবহারবিধি

oldList.........
List<YourObject> newList = new ArrayList<YourObject>();
foreach(YourObject obj : oldList){
   newList.add((YourObject)SerializationUtils.clone(obj));
}

আমি আশা করি এটি সহায়ক হতে পারে।

: ডি


1
কেবল একটি নোট: কমন্স ল্যাং এর এত পুরানো সংস্করণ কেন? প্রকাশের ইতিহাসটি এখানে দেখুন: commons.apache.org/proper/commons-lang/release-history.html
informatik01

0

প্যাকেজ import org.apache.commons.lang.SerializationUtils;

একটি পদ্ধতি আছে SerializationUtils.clone(Object);

উদাহরণ

this.myObjectCloned = SerializationUtils.clone(this.object);

এই প্রশ্নের উত্তর দেওয়ার জন্য এটি কিছুটা পুরানো। এবং আরও অনেক প্রশ্নের উত্তর নীচে মন্তব্য।
মোসকিটো-এক্স

0

আমি সবেমাত্র একটি lib তৈরি করেছি যা সত্তা অবজেক্ট এবং java.util.List অবজেক্টকে ক্লোন করতে সক্ষম। কেবল https://drive.google.com/open?id=0B69Sui5ah93EUTloSktFUkctN0U এ জারটি ডাউনলোড করুন এবং স্থির পদ্ধতি ক্লোনলিস্টঅবজেক্ট (তালিকা তালিকা) ব্যবহার করুন। এই পদ্ধতিটি কেবল তালিকার তালিকাটিই নয় সমস্ত সত্তা উপাদানকেও ক্লোন করে।


0

নীচে আমার জন্য কাজ করেছে ..

কুকুর। জাভা

public Class Dog{

private String a,b;

public Dog(){} //no args constructor

public Dog(Dog d){ // copy constructor
   this.a=d.a;
   this.b=d.b;
}

}

 -------------------------

 private List<Dog> createCopy(List<Dog> dogs) {
 List<Dog> newDogsList= new ArrayList<>();
 if (CollectionUtils.isNotEmpty(dogs)) {
 dogs.stream().forEach(dog-> newDogsList.add((Dog) SerializationUtils.clone(dog)));
 }
 return newDogsList;
 }

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


-1

আমি মনে করি একটি গভীর অনুলিপি অ্যারেলিস্ট তৈরি করার একটি সহজ উপায় আমি খুঁজে পেয়েছি। ধরে নিচ্ছি আপনি একটি স্ট্রিং অ্যারেলিস্ট অ্যারেএ অনুলিপি করতে চান।

ArrayList<String>arrayB = new ArrayList<String>();
arrayB.addAll(arrayA);

যদি এটি আপনার পক্ষে কাজ করে না তবে আমাকে জানান।


3
আপনি যদি তালিকা <তালিকা <জসনঅজেক্ট>> ব্যবহার করেন তবে কাজ করে না উদাহরণস্বরূপ আমার ক্ষেত্রে
djdance

স্ট্রিংগুলি অপরিবর্তনীয়। ক্লোনিংয়ের কোনও অর্থ হয় না এবং আপনার উদাহরণে অ্যারেবি এবং অ্যারেএর সাথে একই বস্তুর উল্লেখ রয়েছে - এটি একটি অগভীর অনুলিপি।
ক্রিশ্চান ফ্রাইস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.