Java 8 öncesi kullanmanız gerekenler:
tourists.removeAll(Collections.singleton(null));
Java 8 sonrası kullanım:
tourists.removeIf(Objects::isNull);
Bunun nedeni zaman karmaşıklığı. Dizilerle ilgili sorun, kaldırma işleminin tamamlanması O (n) sürebilir. Gerçekten Java'da bu, boş noktayı değiştirmek için taşınan kalan öğelerin bir dizi kopyasıdır. Burada sunulan diğer birçok çözüm bu sorunu tetikleyecektir. Birincisi teknik olarak O (n * m) 'dir, burada m 1'dir, çünkü tek bir boştur: yani O (n)
Tüm singleton'ları kaldırmalısınız, dahili olarak bir okuma konumu ve bir yazma konumu olan bir batchRemove () yapar. Ve listeyi yineler. Bir null değerine ulaştığında, okuma konumunu 1 ile yineler. Aynı olduklarında geçer, farklı olduklarında değerleri kopyalamaya devam eder. Sonra sonunda boyutuna göre düzeltir.
Bunu dahili olarak etkili bir şekilde yapar:
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();
}
}
Açıkça görebileceğiniz bir O (n) işlemidir.
Daha hızlı olabilen tek şey, listeyi her iki uçtan yinelemeniz ve bir null bulduğunuzda, değerini sonunda bulduğunuz değere eşit olarak ayarlamanız ve bu değeri azaltmanızdır. Ve iki değer eşleşene kadar yinelendi. Siparişi bozarsınız, ancak ayarladığınız değerlerin ve yalnız bıraktığınız değerlerin sayısını büyük ölçüde azaltırsınız. Bu bilmek için iyi bir yöntemdir ama .set () temelde ücretsiz olduğu için burada çok yardımcı olmaz, ancak bu silme şekli kemeriniz için yararlı bir araçtır.
for (Iterator<Tourist> itr = tourists.iterator(); itr.hasNext();) {
if (itr.next() == null) { itr.remove(); }
}
Bu yeterince makul görünse de, yineleyicideki .remove () dahili olarak çağırır:
ArrayList.this.remove(lastRet);
Bu yine kaldırmanın içindeki O (n) işlemidir. Hızı önemsiyorsanız, yine istediğinizi olmayan bir System.arraycopy () yapar. Bu n ^ 2 yapar.
Ayrıca:
while(tourists.remove(null));
Hangisi O (m * n ^ 2). Burada sadece listeyi tekrarlamakla kalmıyoruz. Boş ile her eşleştiğimizde listenin tamamını tekrarlıyoruz. Sonra n / 2 (ortalama) işlemleri yapmak için System.arraycopy () kaldırmak gerçekleştirin. Kelimenin tam anlamıyla, tüm koleksiyonu değer içeren öğeler ve boş değerli öğeler arasında sıralayabilir ve bitişi daha kısa sürede kesebilirsiniz. Aslında, bu tüm kırık olanlar için geçerlidir. En azından teoride, gerçek system.arraycopy aslında pratikte bir N operasyonu değildir. Teoride, teori ve pratik aynı şeydir; pratikte değiller.
Iterator
? Java-doc kaz. download.oracle.com/javase/6/docs/api/java/util/…