অ্যারে.এএসলিস্ট () এমন একটি তালিকা ফেরত দেয় যা তার আকারকে প্রভাবিত করে ক্রিয়াকলাপগুলিকে মঞ্জুরি দেয় না (নোট করুন যে এটি "অবিস্মরণীয়" হিসাবে একই নয়)।
আপনি new ArrayList<String>(Arrays.asList(split));
একটি আসল অনুলিপি তৈরি করতে পারেন, তবে আপনি যা করার চেষ্টা করছেন তা দেখে এখানে একটি অতিরিক্ত পরামর্শ দেওয়া হয়েছে (এর O(n^2)
ঠিক নীচে আপনার একটি অ্যালগোরিদম রয়েছে)।
আপনি তালিকা থেকে এলোমেলো উপাদানগুলি মুছতে list.size() - count
(এটি কল করতে দিন k
) চান want কেবলমাত্র অনেকগুলি এলোমেলো উপাদান বেছে নিন এবং সেগুলি তালিকার শেষ k
পজিশনে স্যুইপ করুন, তারপরে সেই পুরো ব্যাপ্তিটি মুছুন (যেমন সাবলিস্ট ব্যবহার করে) (এবং এতে পরিষ্কার ())। এটি এটাকে একদম জোঁকের দিকে পরিণত করবে এবং এর অর্থ O(n)
অ্যালগরিদম ( O(k)
আরও সুনির্দিষ্ট)।
আপডেট : নীচে উল্লিখিত হিসাবে, এই অ্যালগরিদম কেবল তখনই তাৎপর্য লাভ করে যদি উপাদানগুলি আনর্ডারড করা হয়, উদাহরণস্বরূপ যদি তালিকাটি কোনও ব্যাগ উপস্থাপন করে। অন্যদিকে, তালিকার যদি অর্থপূর্ণ অর্ডার থাকে তবে এই অ্যালগরিদম এটি সংরক্ষণ করে না (পরিবর্তে পলিজেনিউব্রিকেন্টস অ্যালগরিদম হবে)।
আপডেট 2 : সুতরাং পূর্ববর্তী ক্ষেত্রে, আরও ভাল (লিনিয়ার, অর্ডার বজায় রাখা, তবে ও (এন) এলোমেলো সংখ্যার সাথে) অ্যালগোরিদমটি এরকম কিছু হবে:
LinkedList<String> elements = ...; //to avoid the slow ArrayList.remove()
int k = elements.size() - count; //elements to select/delete
int remaining = elements.size(); //elements remaining to be iterated
for (Iterator i = elements.iterator(); k > 0 && i.hasNext(); remaining--) {
i.next();
if (random.nextInt(remaining) < k) {
//or (random.nextDouble() < (double)k/remaining)
i.remove();
k--;
}
}