Arrays.asList () एक सूची देता है जो अपने आकार को प्रभावित करने वाले कार्यों की अनुमति नहीं देता है (ध्यान दें कि यह "अनमॉडिफ़ेबल" के समान नहीं है)।
आप new ArrayList<String>(Arrays.asList(split));
एक वास्तविक प्रतिलिपि बनाने के लिए कर सकते हैं , लेकिन यह देखते हुए कि आप क्या करने की कोशिश कर रहे हैं, यहां एक अतिरिक्त सुझाव है (आपके पास इसके O(n^2)
ठीक नीचे एक एल्गोरिथ्म है)।
आप सूची से यादृच्छिक तत्वों को list.size() - count
(इसे कॉल करने देना चाहते हैं) हटाना चाहते हैं k
। बस कई यादृच्छिक तत्वों को चुनें और उन्हें k
सूची के अंतिम स्थानों पर स्वैप करें , फिर उस पूरी सीमा को हटा दें (जैसे कि उप-सूची का उपयोग करके) और (उस पर स्पष्ट)। यह एक दुबला और मतलब O(n)
एल्गोरिथ्म के लिए बदल जाएगा ( O(k)
अधिक सटीक है)।
अद्यतन : जैसा कि नीचे उल्लेख किया गया है, यह एल्गोरिथ्म केवल तभी समझ में आता है जब तत्व अनियंत्रित होते हैं, जैसे कि सूची एक बैग का प्रतिनिधित्व करती है। यदि, दूसरी ओर, सूची में एक सार्थक आदेश है, तो यह एल्गोरिथ्म इसे संरक्षित नहीं करेगा (पॉलीजेनबेलिक लूब्रिकेंट्स एल्गोरिथ्म के बजाय)।
अद्यतन 2 : तो पूर्वव्यापी में, एक बेहतर (रैखिक, क्रम बनाए रखना, लेकिन O (n) यादृच्छिक संख्या के साथ) एल्गोरिथ्म कुछ इस तरह होगा:
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--;
}
}