একটি এড়ানোর জন্য কয়েকটি বিকল্প সহ কয়েকটি উদাহরণ দেই ConcurrentModificationException
।
ধরুন আমাদের কাছে নিম্নলিখিত বইয়ের সংগ্রহ রয়েছে
List<Book> books = new ArrayList<Book>();
books.add(new Book(new ISBN("0-201-63361-2")));
books.add(new Book(new ISBN("0-201-63361-3")));
books.add(new Book(new ISBN("0-201-63361-4")));
সংগ্রহ এবং সরান
প্রথম কৌশলটিতে আমরা মুছে ফেলতে চাই এমন সমস্ত অবজেক্টগুলি সংগ্রহ করে (উদাহরণস্বরূপ লুপের জন্য বর্ধিত ব্যবহার করে) এবং পুনরাবৃত্তি শেষ করার পরে, আমরা সমস্ত পাওয়া বস্তুকে সরিয়ে ফেলি।
ISBN isbn = new ISBN("0-201-63361-2");
List<Book> found = new ArrayList<Book>();
for(Book book : books){
if(book.getIsbn().equals(isbn)){
found.add(book);
}
}
books.removeAll(found);
এটি ধরে নেওয়া যায় যে আপনি যে অপারেশনটি করতে চান সেটি হচ্ছে "মুছুন" "
আপনি যদি এই "অ্যাড" করতে চান তবে এই পদ্ধতিটিও কাজ করবে তবে আমি ধরে নেব আপনি দ্বিতীয় সংকলনে কী উপাদান যুক্ত করতে চান তা নির্ধারণ করতে এবং তারপরে addAll
শেষে একটি পদ্ধতি জারি করতে আপনি আলাদা সংগ্রহের মাধ্যমে পুনরাবৃত্তি করবেন ।
ListIterator ব্যবহার করে
আপনি যদি তালিকাগুলির সাথে কাজ করে থাকেন তবে অন্য ListIterator
কৌশলটিতে পুনরাবৃত্তি চলাকালীন নিজেই আইটেমগুলি অপসারণ এবং সংযোজনের জন্য সমর্থন রয়েছে এমন একটি ব্যবহার করে।
ListIterator<Book> iter = books.listIterator();
while(iter.hasNext()){
if(iter.next().getIsbn().equals(isbn)){
iter.remove();
}
}
আবার, আমি উপরের উদাহরণে "অপসারণ" পদ্ধতিটি ব্যবহার করেছি যা আপনার প্রশ্নের দ্বারা বোঝা যাচ্ছে, তবে add
পুনরাবৃত্তির সময় আপনি নতুন পদ্ধতি যুক্ত করার জন্যও এর পদ্ধতিটি ব্যবহার করতে পারেন ।
জেডিকে> = 8 ব্যবহার করা
জাভা 8 বা ততোধিক সংস্করণগুলির সাথে যারা কাজ করছেন তাদের জন্য, এমন কয়েকটি কৌশল রয়েছে যা আপনি এর সুবিধা নিতে ব্যবহার করতে পারেন।
আপনি বেস শ্রেণিতে নতুন removeIf
পদ্ধতিটি ব্যবহার করতে পারেন Collection
:
ISBN other = new ISBN("0-201-63361-2");
books.removeIf(b -> b.getIsbn().equals(other));
অথবা নতুন স্ট্রিম এপিআই ব্যবহার করুন:
ISBN other = new ISBN("0-201-63361-2");
List<Book> filtered = books.stream()
.filter(b -> b.getIsbn().equals(other))
.collect(Collectors.toList());
এই শেষ ক্ষেত্রে, সংগ্রহের বাইরে থাকা উপাদানগুলিকে ফিল্টার করার জন্য, আপনি ফিল্টারকৃত সংগ্রহের (যেমন books = filtered
) এর মূল রেফারেন্সটিকে পুনরায় সাইন ইন করুন বা ফিল্টারকৃত সংগ্রহটি removeAll
মূল সংগ্রহ (যেমন books.removeAll(filtered)
) থেকে পাওয়া উপাদানগুলিতে ব্যবহার করেছেন ।
সাবলিস্ট বা সাবসেট ব্যবহার করুন
এছাড়াও অন্যান্য বিকল্প আছে। যদি তালিকাটি সাজানো থাকে এবং আপনি ধারাবাহিক উপাদানগুলি মুছতে চান তবে আপনি একটি সাবলিস্ট তৈরি করতে পারেন এবং তারপরে এটি সাফ করতে পারেন:
books.subList(0,5).clear();
যেহেতু সাবলিস্টটি মূল তালিকার দ্বারা সমর্থনযোগ্য তাই এটি উপাদানগুলির এই উপবৃত্তটি অপসারণের কার্যকর উপায় হবে।
বাছাই করা সেটগুলি NavigableSet.subSet
পদ্ধতি ব্যবহার করে বা সেখানে প্রদত্ত কাঁচের যে কোনও পদ্ধতি ব্যবহার করে অনুরূপ কিছু অর্জন করা যেতে পারে ।
বিবেচ্য বিষয়:
আপনি কোন পদ্ধতিটি ব্যবহার করছেন তা নির্ভর করে আপনি কী করতে চান
- সংগ্রহ এবং
removeAl
কৌশল কোনও সংগ্রহের সাথে কাজ করে (সংগ্রহ, তালিকা, সেট, ইত্যাদি)।
ListIterator
কৌশল স্পষ্টত শুধুমাত্র উপলব্ধ তাদের দেওয়া যে, তালিকা সাথে কাজ করে ListIterator
বাস্তবায়ন অফার যোগ করতে বা সরাতে অপারেশনের জন্য সমর্থন।
Iterator
পদ্ধতির সংগ্রহে কোন প্রকার সঙ্গে কাজ করবে, কিন্তু এটি শুধুমাত্র অপসারণ অপারেশন সমর্থন করে।
- সঙ্গে
ListIterator
/ Iterator
যোগাযোগ সুস্পষ্ট সুবিধা থেকে আমরা বারবার থেকে সরাতে কিছু কপি করতে হচ্ছে না করা হয়। সুতরাং, এটি খুব দক্ষ।
- জেডিকে 8 স্ট্রিমের উদাহরণটি আসলে কিছুই সরিয়ে দেয় না, তবে কাঙ্ক্ষিত উপাদানগুলির সন্ধান করেছে এবং তারপরে আমরা নতুনটির সাথে মূল সংগ্রহের রেফারেন্সটি প্রতিস্থাপন করেছি এবং পুরানোটিকে আবর্জনা সংগ্রহ করা যাক। সুতরাং, আমরা সংগ্রহের উপরে কেবল একবার পুনরাবৃত্তি করি এবং এটি কার্যকর হবে।
- সংগ্রহ এবং
removeAll
পদ্ধতির অসুবিধাটি হ'ল আমাদের দু'বার পুনরাবৃত্তি করতে হবে। প্রথমে আমরা আমাদের অপসারণের মানদণ্ডের সাথে মেলে এমন কোনও বস্তুর সন্ধানে দুর্বল-লুপটিতে পুনরাবৃত্তি করি এবং এটি সন্ধান পেলে আমরা এটি মূল সংগ্রহ থেকে সরিয়ে দিতে বলি, যা এই আইটেমটির সন্ধান করতে দ্বিতীয় পুনরাবৃত্তির কাজকে বোঝায় এটা মুছুন.
- আমি মনে করি এটি উল্লেখ করার মতো যে
Iterator
ইন্টারফেসের অপসারণের পদ্ধতিটি জাভাদোকসে "alচ্ছিক" হিসাবে চিহ্নিত হয়েছে, যার অর্থ এমন Iterator
যে বাস্তবায়ন হতে পারে যা UnsupportedOperationException
আমরা অপসারণের পদ্ধতিটি অনুরোধ করলে নিক্ষেপ করতে পারে । এই হিসাবে, আমি বলব যে এই উপাদানগুলি অপসারণের জন্য পুনরাবৃত্তি সমর্থনের গ্যারান্টি দিতে না পারলে অন্যদের চেয়ে এই পদ্ধতিটি কম নিরাপদ।