पूर्व जावा 8 आप का उपयोग करना चाहिए:
tourists.removeAll(Collections.singleton(null));
पोस्ट-जावा 8 का उपयोग करें:
tourists.removeIf(Objects::isNull);
यहाँ कारण समय जटिलता है। सरणियों के साथ समस्या यह है कि हटाने का ऑपरेशन पूरा होने में O (n) समय ले सकता है। वास्तव में जावा में यह खाली जगह को बदलने के लिए शेष तत्वों की एक सरणी प्रतिलिपि है। यहां दिए गए कई अन्य समाधान इस मुद्दे को ट्रिगर करेंगे। पूर्व तकनीकी रूप से O (n * m) है जहाँ m 1 है क्योंकि यह एक सिंगलटन नल है: इसलिए O (n)
आपको सिंगलटन को हटा देना चाहिए, आंतरिक रूप से यह एक बैचमूव () करता है जिसमें एक पठन स्थिति और एक लेखन स्थिति होती है। और सूची को प्रसारित करता है। जब यह एक अशक्त हिट करता है, तो यह केवल पढ़ने की स्थिति को 1 से पुनरावृत्त करता है। जब वे समान होते हैं तो वे गुजरते हैं, जब वे भिन्न होते हैं तो यह मूल्यों की नकल के साथ आगे बढ़ता रहता है। फिर अंत में इसका आकार छोटा हो जाता है।
यह आंतरिक रूप से प्रभावी रूप से करता है:
public static <E> void removeNulls(ArrayList<E> list) {
int size = list.size();
int read = 0;
int write = 0;
for (; read < size; read++) {
E element = list.get(read);
if (element == null) continue;
if (read != write) list.set(write, element);
write++;
}
if (write != size) {
list.subList(write, size).clear();
}
}
जिसे आप स्पष्ट रूप से O (n) ऑपरेशन देख सकते हैं।
केवल एक चीज जो कभी भी तेज हो सकती है, यदि आपने सूची को दोनों छोरों से पुनरावृत्त किया है, और जब आपको एक अशक्त पाया गया, तो आप इसके मूल्य को अंत में मिले मूल्य के बराबर सेट करते हैं, और उस मूल्य को घटा देते हैं। और दो मूल्यों के मिलान होने तक इसकी पुनरावृत्ति हुई। आप ऑर्डर को गड़बड़ कर देंगे, लेकिन आपके द्वारा सेट किए गए मानों की संख्या को बहुत कम कर देंगे। यह जानने के लिए एक अच्छा तरीका है, लेकिन यहाँ से बहुत मदद नहीं मिलेगी। () मूल रूप से मुफ़्त है, लेकिन डिलीट का वह रूप आपके बेल्ट के लिए एक उपयोगी उपकरण है।
for (Iterator<Tourist> itr = tourists.iterator(); itr.hasNext();) {
if (itr.next() == null) { itr.remove(); }
}
हालांकि यह उचित रूप से उचित लगता है,। इटरेटर पर (।) आंतरिक रूप से कॉल करता है:
ArrayList.this.remove(lastRet);
जो फिर से हटाने के भीतर ओ (एन) ऑपरेशन है। यह एक System.arraycopy () करता है जो फिर से वह नहीं है जो आप चाहते हैं, यदि आप गति की परवाह करते हैं। यह इसे n ^ 2 बनाता है।
वहाँ भी:
while(tourists.remove(null));
जो O (m * n ^ 2) है। यहां हम न केवल सूची को पुनरावृत्त करते हैं। हम पूरी सूची को दोहराते हैं, हर बार जब हम शून्य से मेल खाते हैं। फिर हम निकाले जाने के लिए System.arraycopy () करने के लिए n / 2 (औसत) ऑपरेशन करते हैं। आप काफी शाब्दिक रूप से, मूल्यों के साथ पूरे संग्रह को क्रमबद्ध कर सकते हैं और शून्य मान के साथ आइटम और कम समय में समाप्त ट्रिम कर सकते हैं। वास्तव में, यह सभी टूटे हुए लोगों के लिए सच है। कम से कम सिद्धांत में, वास्तविक system.arraycopy वास्तव में एक एन ऑपरेशन नहीं है। सिद्धांत रूप में, सिद्धांत और व्यवहार एक ही चीज हैं; व्यवहार में वे नहीं हैं।
Iterator
? खोदा जावा-डॉक। download.oracle.com/javase/6/docs/api/java/util/…