java - তালিকার বিপরীত সাবলিস্টের তালিকা.এডএলএল কেন একটি সাম্প্রতিককালে মডেলিংএক্সেপশন ঘটায়




arraylist collections (3)

এখানে ArrayList#checkForComodification

private void checkForComodification() {
    if (ArrayList.this.modCount != this.modCount)
        throw new ConcurrentModificationException();
    }
}

তবে এই বিশেষ ক্ষেত্রে আপনাকে পুনরায় বিপরীত সাব-লিস্ট পুনরায় যুক্ত করার দরকার নেই, যেহেতু বিপরীতটি মূল তালিকায় সম্পাদিত হয়েছে। সুতরাং আপনার যা দরকার তা কেবল ড্রপ করা

list.removeAll(...);
list.addAll(...);

এবং কেবল এই কোডটি ছেড়ে দিন:

List<Integer> toReverse = list.subList(startIndex, endIndex+1);
Collections.reverse(toReverse);

আমি একটি তালিকার একটি উপ তালিকা নেওয়ার চেষ্টা করেছি, এটিকে বিপরীত করব, এবং reversed তালিকাটিকে আবার শুরু অবস্থানে রাখি। উদাহরণস্বরূপ, বলুন আমাদের তালিকা রয়েছে [1, 2, 3, 4, 5, 6] , তারপরে সূচক 2 থেকে সূচকে 4 এ পরিবর্তিত হবে [1, 2, 5, 4, 3, 6]

আমি এর জন্য কিছু কোড লিখেছি, তবে এটি প্রতিবার একটি সাম্প্রতিককালে মডেলিং এক্সেক্সশন দেয় (স্টার্টইন্ডেক্স == এন্ডআইডেক্স ব্যতীত)। একটি সর্বনিম্ন পুনরুত্পাদনযোগ্য উদাহরণ নীচে সরবরাহ করা হয়েছে:

int startIndex = 2;
int endIndex = 4;
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);

List<Integer> toReverse = list.subList(startIndex, endIndex+1);
Collections.reverse(toReverse);
list.removeAll(toReverse);
list.addAll(startIndex, toReverse);

থ্রেড "মূল" java.util.ConcurrentModificationsException মধ্যে ব্যতিক্রম
java.util.ArrayList- এ SubList.checkForComodifications (অজানা উত্স)
java.util.ArrayList এ $ সাবলিস্ট.সাইজ (অজানা উত্স) এ
java.util.AbstractCલેક્શન.toArray (অজানা উত্স) এ
java.util.ArrayList.addAll (অজানা উত্স) এ
test.ConcurrentExample.main (ConcurrentExample.java:64)

ত্রুটিটি প্রকৃত রেখাটি হ'ল list.addAll(startIndex, toReverse);

আমি নিশ্চিত নই যে সমস্যাটি পুনরাবৃত্ত হওয়ার সাথে সাথে কোনও পরিবর্তন হচ্ছে বলে মনে হচ্ছে না। এটি কেন ঘটছে এবং / অথবা কীভাবে এটি ঠিক করা যায় তা যদি কেউ ব্যাখ্যা করতে পারে তবে তা প্রশংসিত হবে।


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

list.subList(startIndex, endIndex+1)

আপনি এই তালিকাটি অনুলিপি করে একটি কোড ঠিক করতে পারেন

List<Integer> toReverse = new ArrayList<>(list.subList(startIndex, endIndex+1));

হেলোস্পার্ক এবং নীর লেভির পরামর্শ থেকে, স্ট্রিম এড়ুন এবং সীমা ব্যবহার করুন

List<Integer> toReverse = list.stream() //
                .skip(startIndex) //
                .limit(endIndex + 1) //
                .collect(Collectors.toList());




concurrentmodification