অ্যারেস.এএসলিস্ট দ্বারা তৈরি তালিকায় () সরান () অসমর্থিত অপারেশন এক্সেক্সশনটি ছুড়ে ফেলে


91

আমার কাছে একটি সংগ্রহ c1<MyClass>এবং একটি অ্যারে রয়েছে a<MyClass>। আমি একটি সংগ্রহে অ্যারের রূপান্তর করার চেষ্টা করছি c2কি c1.removeAll(c2), কিন্তু এই ছোঁড়ার UnsupportedOperationException। আমি দেখতে পেলাম যে asList()অ্যারে ক্লাসের রিটার্ন Arrays.ArrayListক্লাস দেয় এবং এই ক্লাসটি উত্তরাধিকার সূত্রে removeAll()পায় AbstractList()যার বাস্তবায়ন নিক্ষেপ করে UnsupportedOperationException

    Myclass la[] = getMyClass();
    Collection c = Arrays.asList(la);
    c.removeAll(thisAllreadyExistingMyClass);

উপাদানগুলি সরানোর কোনও উপায় আছে কি? সাহায্য করুন


সম্পর্কিত প্রশ্ন: স্ট্যাকওভারফ্লো.com
রাম

উত্তর:


173

Arrays.asListListএকটি অ্যারের কাছাকাছি একটি মোড়ক ফেরত দেয় । এই মোড়কের একটি নির্দিষ্ট আকার রয়েছে এবং এটি সরাসরি অ্যারে দ্বারা ব্যাক হয় এবং যেমন কলগুলি setঅ্যারে সংশোধন করবে এবং অন্য যে কোনও পদ্ধতি যা তালিকার সংশোধন করে তা একটি নিক্ষেপ করবে UnsupportedOperationException

এটি ঠিক করতে, আপনাকে মোড়কের তালিকার বিষয়বস্তু অনুলিপি করে একটি নতুন সংশোধনযোগ্য তালিকা তৈরি করতে হবে। ArrayListকন্সট্রাক্টর যা গ্রহণ করে তা ব্যবহার করে এটি করা সহজ Collection:

Collection c = new ArrayList(Arrays.asList(la));

4
আমি java.util.Arrays asList()পদ্ধতির জন্য সোর্স কোডটির দিকে চেয়ে ছিলাম এবং এটি কোনওরূপে ফিরে আসে বলে মনে হচ্ছে ArrayList। যাইহোক, আমি যখন একটি করি System.out.println(list.getClass());, আমি পাই class java.util.Arrays$ArrayList। সুতরাং এটি অভ্যন্তর ArrayListশ্রেণীর ব্যবহার করে , যার কোনও addবা removeপদ্ধতি নেই। আমি কেবল ভাবছি যে এটি ArrayListব্যবহার করার পরিবর্তে একটি অভ্যন্তরীণ শ্রেণি থাকার বিন্দুটি কী java.util.ArrayListএবং কেন একটি পদ্ধতি add()এবং remove()পদ্ধতি নেই?
আব্দুল

আমার উপরের মন্তব্যটির সংশোধন: এটিতে একটি পদ্ধতি addএবং removeপদ্ধতি রয়েছে
আব্দুল

4
@ আবদুল কারণ একটি নির্দিষ্ট আকারের মতো কোনও জিনিস নেই java.util.ArrayList। আপনি Listযদি এটির সাথে অবৈধ কিছু করেন (যেমন যোগ বা অপসারণ), এবং ArrayListসেই প্রয়োজনটি পূরণ না করে তবে আপনি তার একটি ব্যতিক্রম ছুঁড়ে ফেলতে চান ।
এটিয়েন ডি মার্টেল

@ আবদুল Arrays.asListকেবল একটি মোড়ক তৈরি করে List। তবে এটি এখনও একটি java.util.List, সুতরাং এটি অবশ্যই এই পদ্ধতিগুলি থাকা উচিত। তবে সেগুলি প্রয়োগ করা যাবে না কারণ এটি বিভিন্ন আকারের সাথে একটি নতুন অ্যারে তৈরি করতে পারে। যা করা যায় না কারণ আপনি যে পরিবর্তনগুলি এখনও করতে পারেন তা ফেরত তালিকা এবং মূল অ্যারের মাধ্যমেই করা যেতে পারে। প্রত্যাবর্তিত তালিকাটি পরিবর্তন করতে পারলে এটি সম্ভব হবে না যাতে এটি মূলত মূল অ্যারে রেফারেন্সটি ফেলে দেয়।
অ্যাডাম হোয়েক

13

হ্যাঁ, এটি Arrays.asList(..)হ'ল সংগ্রহ যা প্রসারিত বা সঙ্কুচিত করা যায় না (কারণ এটি মূল অ্যারে দ্বারা সমর্থিত, এবং এটির আকার পরিবর্তন করা যায় না)।

আপনি যদি উপাদানগুলি মুছে ফেলতে চান তবে হয় new ArrayList(Arrays.asList(..)অ্যারে থেকে উপাদান তৈরি করুন বা মুছে ফেলুন (এটি কম দক্ষ এবং লিখতে আরও শক্ত হবে)


() একটি ফেরৎ Arrays.asList: +1 টি এই উত্তরটি শুধুমাত্র সঠিক অন্যতম unmodifiable যে কি ব্যতিক্রম নিক্ষেপ করা হয়েছে - তালিকা। "অ্যারে দ্বারা ব্যাকড" ইত্যাদির সাথে এটি করার কিছুই নেই ... সমস্ত অ্যারেলিস্ট অ্যারে দ্বারা সমর্থিত - বড় কথা।
বোহেমিয়ান

4
তবে আপনি যদি ডক্সে আরও পড়েন, তবে আপনি বুঝতে পেরেছেন যে এটি আসলে অবিবেচনাযোগ্য নয় ... "নির্দিষ্ট অ্যারে দ্বারা ব্যাক করা একটি নির্দিষ্ট আকারের তালিকা ফিরিয়ে দেয় ((অ্যারেতে" মাধ্যমে "লিখুন" প্রত্যাবর্তিত তালিকার পরিবর্তনগুলি ।) "-1, এতিয়েন ঠিক আছে।
স্টিভেন শ্লানস্কার

4
@ স্টিভেন হ্যাঁ, এ কারণেই এটি "অবিস্মরণীয়" বা "কেবলমাত্র পঠনযোগ্য" না বলে "নির্দিষ্ট আকার" বলে। প্রকৃতপক্ষে, আমি এখনই আমার উত্তর সম্পাদনা করতে যাব এটি প্রতিফলিত করতে।
এটিয়েন ডি মার্টেল

4
@ বোহেমিয়ান, প্রত্যাবর্তিত সংগ্রহগুলি 'সংশোধনযোগ্য' কারণ এটি 'সেট' পদ্ধতিটি কল করা সম্ভব।
জওয়ালারনার

4
আপনি যদি এর মতো নিট তুলতে চলেছেন, আপনি পাশাপাশি "এটিকে অসমর্থিত অপারেশন এক্সেক্সশনটি ছুঁড়ে দেয় কারণ কোডটিতে একটি অসমর্থিত অপারেশন এক্সপেশন স্টেটমেন্ট রয়েছে" এর মতো ভ্যাপিড জিনিসগুলি বলতে পারেন। কোন এআইপিআইয়ের গ্রাহকরা এ্যাবস্ট্রাকব্লাহ সুপারক্লাস কোন ব্যতিক্রম ছুঁড়ে ফেলছে তা যত্নশীল নয়, তারা ক্লাসের ব্যবহার এবং চুক্তিগুলির প্রত্যাশা কী তা বিবেচনা করে। জেভিএম ভি + 1-তে, সম্পূর্ণ ব্যর্থ হয় যেখানে ক্লাসের পাঠাগারটি ব্যতিক্রম হয় সেখানে পরিবর্তন হয় - তবে চুক্তি পরিবর্তন হবে না।
স্টিভেন শ্লানস্কার

7

এটি সেইভাবে Array.asList()কাজ করে, কারণ এটি অ্যারে দ্বারা সরাসরি সমর্থিত হয়। সম্পূর্ণরূপে সংশোধনযোগ্য তালিকা পেতে, আপনাকে নিজের দ্বারা তৈরি করা সংগ্রহটিতে সংগ্রহটি ক্লোন করতে হবে।

Collection c = new ArrayList(Arrays.asList(la))

4
তালিকাটি পরিবর্তনযোগ্য তবে কেবল সেট () এর মাধ্যমে। প্রত্যাবর্তিত সংগ্রহটি স্থির আকারের।
javalearner

আমি আসলে কখনই বলি নি যে এটি অশোধিত। কেবলমাত্র (সম্পূর্ণ) সংশোধনযোগ্য তালিকা পেতে আপনাকে একটি ব্যবহার করতে হবে ArrayList। পার্থক্য সম্ভবত খুব স্পষ্ট ছিল না যদিও। :-) তালিকাটি সংশোধনযোগ্য কিনা তা সংজ্ঞার প্রশ্ন নয়, এটি "আধা-পরিবর্তনকারী" তবে আমার দৃষ্টিতে সম্পূর্ণরূপে পরিবর্তনযোগ্য নয়।
হেনকো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.