Vor Java 8 sollten Sie Folgendes verwenden:
tourists.removeAll(Collections.singleton(null));
Verwendung nach Java 8:
tourists.removeIf(Objects::isNull);
Der Grund hierfür ist die zeitliche Komplexität. Das Problem bei Arrays besteht darin, dass ein Entfernungsvorgang O (n) Zeit in Anspruch nehmen kann. In Java ist dies eine Array-Kopie der verbleibenden Elemente, die verschoben werden, um die leere Stelle zu ersetzen. Viele andere hier angebotene Lösungen lösen dieses Problem aus. Ersteres ist technisch gesehen O (n * m), wobei m 1 ist, weil es eine Singleton-Null ist: also O (n)
Sie solltenAlle Singleton entfernen, intern führt es einen batchRemove () aus, der eine Lese- und eine Schreibposition hat. Und iteriert die Liste. Wenn es eine Null trifft, iteriert es einfach die Leseposition um 1. Wenn sie gleich sind, passiert es, wenn sie unterschiedlich sind, fährt es fort, die Werte zu kopieren. Am Ende wird es dann zugeschnitten.
Dies geschieht effektiv intern:
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();
}
}
Was Sie explizit sehen können, ist eine O (n) -Operation.
Das einzige, was jemals schneller sein könnte, ist, wenn Sie die Liste von beiden Seiten iterieren und wenn Sie eine Null gefunden haben, setzen Sie ihren Wert gleich dem Wert, den Sie am Ende gefunden haben, und dekrementieren Sie diesen Wert. Und iteriert, bis die beiden Werte übereinstimmen. Sie würden die Reihenfolge durcheinander bringen, aber die Anzahl der von Ihnen festgelegten Werte im Vergleich zu denen, die Sie alleine gelassen haben, erheblich reduzieren. Dies ist eine gute Methode, die Sie kennen sollten, die hier jedoch nicht viel hilft, da .set () grundsätzlich kostenlos ist. Diese Form des Löschens ist jedoch ein nützliches Werkzeug für Ihren Gürtel.
for (Iterator<Tourist> itr = tourists.iterator(); itr.hasNext();) {
if (itr.next() == null) { itr.remove(); }
}
Während dies vernünftig erscheint, ruft die .remove () auf dem Iterator intern auf:
ArrayList.this.remove(lastRet);
Welches ist wieder die O (n) -Operation innerhalb der Entfernung. Es führt eine System.arraycopy () durch, die wiederum nicht Ihren Wünschen entspricht, wenn Sie Wert auf Geschwindigkeit legen. Dies macht es n ^ 2.
Es gibt auch:
while(tourists.remove(null));
Welches ist O (m * n ^ 2). Hier iterieren wir nicht nur die Liste. Wir wiederholen die gesamte Liste jedes Mal, wenn wir mit der Null übereinstimmen. Dann führen wir n / 2 (durchschnittliche) Operationen aus, um die System.arraycopy () durchzuführen, um das Entfernen durchzuführen. Sie können buchstäblich die gesamte Sammlung zwischen Elementen mit Werten und Elementen mit Nullwerten sortieren und das Ende in kürzerer Zeit kürzen. In der Tat gilt das für alle kaputten. Zumindest theoretisch ist die eigentliche system.arraycopy in der Praxis keine N-Operation. In Theorie, Theorie und Praxis sind dasselbe; in der Praxis sind sie nicht.
Iterator
? Dig Java-Doc. download.oracle.com/javase/6/docs/api/java/util/…