কীভাবে একটি জাভা.ইটিল.লিস্টটি অন্য জাভা.ইটিল.লিস্টে কপি করবেন


135

আমার কাছে একটি রয়েছে List<SomeBean>যা একটি ওয়েব পরিষেবা থেকে পপুলেটেড। আমি সেই তালিকাটির বিষয়বস্তুগুলি একই ধরণের একটি খালি তালিকায় অনুলিপি / ক্লোন করতে চাই। একটি তালিকা অনুলিপি করার জন্য একটি গুগল অনুসন্ধান আমাকে Collections.copy()পদ্ধতিটি ব্যবহার করার পরামর্শ দিয়েছে । সমস্ত উদাহরণে আমি দেখেছি, গন্তব্য তালিকায় অনুলিপি করার জন্য আইটেমগুলির সঠিক সংখ্যা রয়েছে বলে মনে করা হয়েছিল।

আমি যে তালিকাটি ব্যবহার করছি এটি একটি ওয়েব পরিষেবাদির মাধ্যমে জনপ্রিয় এবং এতে শত শত বস্তু রয়েছে, আমি উপরের কৌশলটি ব্যবহার করতে পারি না। নাকি আমি এটা ভুল ব্যবহার করছি ?? !! যাইহোক, এটির কাজ করার জন্য, আমি এই জাতীয় কিছু করার চেষ্টা করেছি, তবে আমি এখনও পেয়েছি IndexOutOfBoundsException

List<SomeBean> wsList = app.allInOne(template);

List<SomeBean> wsListCopy=new ArrayList<SomeBean>(wsList.size());   
Collections.copy(wsListCopy,wsList);
System.out.println(wsListCopy.size());

আমি এটি ব্যবহার করার চেষ্টা করেছি wsListCopy=wsList.subList(0, wsList.size())কিন্তু ConcurrentAccessExceptionকোডটি পরে পেয়েছি । হিট এবং বিচার। :)

যাইহোক, আমার প্রশ্নটি সহজ, আমি কীভাবে আমার তালিকার পুরো বিষয়বস্তু অন্য তালিকায় অনুলিপি করব? অবশ্যই পুনরাবৃত্তির মাধ্যমে নয়।


11
যে কোনও অনুলিপি অবশ্যই পুনরাবৃত্তি ব্যবহার করবে। আপনি এটি লুকিয়ে রাখতে পারেন তবে এটি এখনও থাকবে।
পিটার লরে

1
প্রথমত: আপনি কি সেই তালিকাটি অনুলিপি করার প্রয়োজন? এটি করতে আপনার প্রেরণা কী?
পেপেটারকা

2
হ্যাঁ, পুনরাবৃত্তি কেবল সেই স্তরগুলির নীচে লুকানো আছে। মন্তব্যটি কোনও পুনরাবৃত্তির উত্তর আটকাতে যুক্ত করা হয়েছিল। :)
মনো যমুন

@ পিপেরকা আমি তালিকায় অপারেশন করছি, যেমন সরানোর সমস্ত ()। এটি তালিকার মূল তথ্যটি হারাতে পারে। এবং "সেই ডেটা" পরেও প্রয়োজনীয়।
মনো যমুন

কোন তালিকার আসল প্রকারটি কী, যা দিয়ে ফিরে আসছে app.allInOne(template)? ArrayList?
আন্দ্রেমনি

উত্তর:


235

কেবল এটি ব্যবহার করুন:

List<SomeBean> newList = new ArrayList<SomeBean>(otherList);

দ্রষ্টব্য: এখনও থ্রেডটি নিরাপদ নয়, যদি আপনি otherListঅন্য থ্রেড থেকে পরিবর্তন করেন তবে উদাহরণস্বরূপ আপনি এটিকেotherList (এবং এমনকি newList) একটি তৈরি করতে চাইতে পারেন CopyOnWriteArrayList- বা রিটারেন্টরিডড্রাইটলক এর মতো একটি লক ব্যবহার করতে পারেন যা পড়ুন / লিখিত অ্যাক্সেসের তালিকাগুলিতে অ্যাক্সেস লিখুন একযোগে অ্যাক্সেস করা হয়েছে।


1
এখন, আমি কেবল সত্যিই বোকা বোধ করছি :) আমি আশা করি যে এটির মতো এটি নির্মাণ করা কোনওরকম ছোঁড়াবে না ConcurrentAccessException
মনো যমুন


5
+1 যদি তিনি কনকন্টারমোডিফেকেশনএক্সসেপশন পেয়ে থাকেন, তবে তার প্রথমে ঠিক করা দরকার এমন একটি সম্মতিযুক্ত ইস্যু রয়েছে।
পিটার লরে

5
প্রশ্নটিতে "অনুলিপি / ক্লোন" উল্লেখ করা থাকলে কেন এই উত্তর এতগুলি পয়েন্ট পাচ্ছে? এটি, যতক্ষণ না অন্য কিছু উত্তরের ক্লোনিংয়ের সাথে কোনও সম্পর্ক নেই। সংগ্রহ / স্ট্রিম নির্দিষ্ট ইউটিলিটি-পদ্ধতি আপনি ব্যবহার করুন যাই হোক না কেন সংগ্রহের অভ্যন্তরের অবজেক্টগুলির জন্য একই তথ্যসূত্র রাখা হবে।
yuranos

3
উত্তরটি ভুল। বিষয়বস্তু অনুলিপি করা হয় না। কেবল এটি উল্লেখ
অবিশ্বাস্য জানুয়ারী

33

এটি করার জন্য এটি খুব সুন্দর জাভা 8 উপায়:

List<String> list2 = list1.stream().collect(Collectors.toList());

অবশ্যই এখানে সুবিধা হ'ল আপনি কেবল ফিল্টার করতে পারেন এবং কেবল তালিকার অংশের অনুলিপি করতে পারেন।

যেমন

//don't copy the first element 
List<String> list2 = list1.stream().skip(1).collect(Collectors.toList());

4
ফলাফলের তালিকাটি কি মূল তালিকার গভীর অনুলিপি বা অগভীর অনুলিপি?
বিজ্ঞাপন ইনফিনিটাম

7
একটি অগভীর অনুলিপি।
কেপ

3
দুঃখের বিষয়, এটি থ্রেডও নিরাপদ নয়। listসংগ্রহকারী চলমান অবস্থায় ধরে নেওয়া পরিবর্তন করা হয়, একটি ConcurrentModificationExceptionনিক্ষেপ করা হয়।
সি-অটো

@ ড্যান, শেষ উপাদানটির অনুলিপিটি কীভাবে এড়ানো যায়?
সিকেএম

@ চন্দ্রেশ শেষ উপাদানটি অনুলিপি করতে এড়াতে আপনি কেবল ব্যবহার করবেন.limit(list1.size() - 1)
ম্যাথু কার্পেন্টার

13
originalArrayList.addAll(copyArrayofList);

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

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


2
এটি এখানে কয়েকটি সত্য উত্তরগুলির মধ্যে একটি, কারণ এটি # অ্যাডএল সমস্ত অগভীর অনুলিপি তৈরি করে এবং কীভাবে গভীর অনুলিপি করতে হয় তা নির্দিষ্ট করে। আরো বিস্তারিত: stackoverflow.com/questions/715650/...
cellepo

7

আমি এটির মতো কিছু করার চেষ্টা করেছি, তবে আমি এখনও একটি সূচিপত্র ছাড়াই পেয়েছি ception

আমি একটি সমকালীনঅ্যাক্সেসএক্সসেপশন পেয়েছি

এর অর্থ আপনি তালিকাটি অনুলিপি করার সময় তালিকার সংশোধন করছেন, সম্ভবত অন্য কোনও থ্রেডে। এটি ঠিক করতে আপনার হয় হয়

  • সমকালীন অ্যাক্সেসের জন্য নকশাকৃত একটি সংগ্রহ ব্যবহার করুন।

  • সংগ্রহটি যথাযথভাবে লক করুন যাতে আপনি এটির উপরে পুনরাবৃত্তি করতে পারেন (বা আপনাকে এমন কোনও পদ্ধতি কল করার অনুমতি দিন যা এটি আপনার জন্য করে)

  • মূল তালিকাটি অনুলিপি করার প্রয়োজন এড়াতে একটি উপায় সন্ধান করুন।


4

জাভা 10 থেকে শুরু :

List<E> oldList = List.of();
List<E> newList = List.copyOf(oldList);

List.copyOf()Listপ্রদত্ত উপাদানগুলিকে ধারণ করে এমন একটি অবিশ্বাস্য returnsCollection

প্রদত্ত Collectionঅবশ্যই nullহওয়া উচিত নয় এবং এতে অবশ্যই কোনওটি থাকা উচিত নয়null উপাদান ।

এছাড়াও, আপনি যদি একটি এর একটি অনুলিপি তৈরি করতে চান List, আপনি এখানে অনেক ভাল উত্তর খুঁজে পেতে পারেন ।


3

নাল-নিরাপদ উপায়ে জাভা 8 এর সাথে আরও একটি পদ্ধতি রয়েছে।

List<SomeBean> wsListCopy = Optional.ofNullable(wsList)
                                    .map(List::stream)
                                    .orElseGet(Stream::empty)
                                    .collect(Collectors.toList());

আপনি যদি একটি উপাদান এড়িয়ে যেতে চান।

List<SomeBean> wsListCopy = Optional.ofNullable(wsList)
                                    .map(List::stream)
                                    .orElseGet(Stream::empty)
                                    .skip(1)
                                    .collect(Collectors.toList());

1

আমি একই সমস্যা চাপ ছিল ConcurrentAccessException এবং mysolution ছিল:

List<SomeBean> tempList = new ArrayList<>();

for (CartItem item : prodList) {
  tempList.add(item);
}
prodList.clear();
prodList = new ArrayList<>(tempList);

সুতরাং এটি সময়ে কেবল একটি অপারেশন কাজ করে এবং বহিরাজনীকরণ এড়ানো ...


1

আমি অনুরূপ কিছু চেষ্টা করেছিলাম এবং সমস্যাটির পুনরুত্পাদন করতে সক্ষম হয়েছি (ইন্ডেক্সআউটঅফফাউন্ডস এক্সপেশন)। নীচে আমার অনুসন্ধানসমূহ:

1) কালেকশনস কপি বাস্তবায়ন (ডাস্টলিস্ট, উত্স তালিকা) প্রথমে আকার () পদ্ধতিতে কল করে গন্তব্য তালিকার আকার পরীক্ষা করে। যেহেতু আকার () পদ্ধতিতে কল সর্বদা তালিকায় থাকা উপাদানগুলির সংখ্যা (এই ক্ষেত্রে 0) ফিরিয়ে দেবে, তাই কনস্ট্রাক্টর অ্যারেলিস্ট (ক্ষমতা) ব্যাকিং অ্যারের কেবল প্রাথমিক ক্ষমতা নিশ্চিত করে এবং এর সাথে এর কোনও সম্পর্ক নেই the তালিকার আকার। অতএব আমরা সর্বদা ইনডেক্সআউটআউটবাউন্ডসেক্সপশন পাই।

2) তুলনামূলক সহজ উপায় হ'ল সেই নির্মাণকারীর ব্যবহার যা কোনও সংগ্রহকে তার যুক্তি হিসাবে গ্রহণ করে:

List<SomeBean> wsListCopy=new ArrayList<SomeBean>(wsList);  

0

পুনরায় indexOutOfBoundsException, আপনার সাবলিস্ট আরগগুলি সমস্যা; আপনাকে আকার -1 এ সাবলিস্টটি শেষ করতে হবে। শূন্য-ভিত্তিক হওয়ায় একটি তালিকার সর্বশেষ উপাদানটি সর্বদা আকার -1 থাকে, আকারের অবস্থানে কোনও উপাদান থাকে না, সুতরাং ত্রুটি।



0

আমি কোন সঠিক উত্তর দেখতে পাচ্ছি না। যদি আপনি একটি গভীর অনুলিপি চান তবে আপনাকে পুনরুক্তি করতে হবে এবং ম্যানুয়ালি অবজেক্টটি অনুলিপি করতে হবে (আপনি একটি অনুলিপি নির্মাণকারী ব্যবহার করতে পারেন)।


এটি এখানে কয়েকটি সত্য উত্তরগুলির মধ্যে একটি। আরো বিস্তারিত: stackoverflow.com/questions/715650/...
cellepo

-2

আপনি যদি একটি তালিকার পরিবর্তন চান না তবে অন্য তালিকাকে প্রভাবিত করতে চেষ্টা করুন I এটি আমার পক্ষে কাজ করেছে
আশা করি এটি সাহায্য করে।

  public class MainClass {
  public static void main(String[] a) {

    List list = new ArrayList();
    list.add("A");

    List list2 = ((List) ((ArrayList) list).clone());

    System.out.println(list);
    System.out.println(list2);

    list.clear();

    System.out.println(list);
    System.out.println(list2);
  }
}

> Output:   
[A]  
[A]  
[]  
[A]

-3

সাবলিস্ট ফাংশনটি একটি কৌশল, প্রত্যাবর্তিত অবজেক্টটি এখনও মূল তালিকায় রয়েছে। সুতরাং আপনি যদি সাবলিস্টে কোনও অপারেশন করেন তবে এটি আপনার কোডে একযোগে ব্যতিক্রম ঘটায়, এটি একক থ্রেড বা মাল্টি থ্রেডই নয়।

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