कुशलतापूर्वक एक ArrayList
से तत्वों की एक संख्या को हटाने के कुछ विचार की आवश्यकता है।
Iterator<DealerProductCount> it = wsResponse.Dealers.iterator();
while (it.hasNext()) {
if (it.next().ParentId != -10) {
it.remove();
}
}
समस्या यह है कि हर बार जब आप एक तत्व आप (औसतन) कॉपी शेष तत्वों में से आधे को दूर है: अनुभवहीन दृष्टिकोण कुछ इस तरह है। ऐसा इसलिए है क्योंकि ArrayList
से तत्व को हटाने से तत्व के बाद सभी तत्वों को प्रतिलिपि बनाना आवश्यक है, बाईं ओर एक स्थिति हटा दी गई है।
तत्वों की सूची को शामिल करने वाला आपका मूल समाधान अनिवार्य रूप से वही काम करता है। दुर्भाग्यवश, ArrayList
के गुण उपरोक्त से बेहतर करने के लिए removeAll
की अनुमति नहीं देते हैं।
आप तत्वों की एक संख्या को दूर करने की उम्मीद है, तो निम्न और अधिक कुशल है:
ArrayList<DealerProductCount> retain =
new ArrayList<DealerProductCount>(wsResponse.Dealers.size());
for (DealerProductCount dealer : wsResponse.Dealers) {
if (dealer.ParentId == -10) {
retain.add(dealer);
}
}
// either assign 'retain' to 'wsResponse.Dealers' or ...
wsResponse.Dealers.clear();
wsResponse.Dealers.addAll(retain);
हम (लगभग) कॉपी कर रहे हैं पूरी सूची में दो बार, तो यह भी (औसतन) का विश्लेषण करना चाहिए अगर आप को दूर 4 तत्वों के रूप में कम से कम।
ऐसा नहीं है कि कार्यात्मक प्रोग्रामिंग भाषाओं/पुस्तकालयों नोट करने के लिए ठेठ समर्थन एक फिल्टर विधि दिलचस्प है, और उस सूची के माध्यम से एक पास में यह काम पूरा कर सकते हैं; यानी बहुत अधिक कुशलता से। मुझे लगता है कि अगर जावा लैम्बडा का समर्थन करता है तो हम महत्वपूर्ण सुधार की उम्मीद कर सकते हैं, और संग्रह API को उनका उपयोग करने के लिए बढ़ाया जाता है।
स्रोत
2011-06-08 15:18:57
अन्य डेटा संरचनाएं हैं जिनके लिए आइटम निष्कासन अधिक कुशल है। एक लिंक्डलिस्ट से निकालना ओ (एन) प्रदर्शन होगा। हैश मैप से निकालना निरंतर समय प्रदर्शन होगा। –