Ich versuche es mit einer solchen Schleife
// ArrayList tourists
for (Tourist t : tourists) {
if (t != null) {
t.setId(idForm);
}
}
Aber es ist nicht schön. Kann mir jemand eine bessere Lösung vorschlagen?
Einige nützliche Benchmarks, um eine bessere Entscheidung zu treffen:
Iterator
? Dig Java-Doc. download.oracle.com/javase/6/docs/api/java/util/…Antworten:
Versuchen:
Lesen Sie die Java-API . Der Code löst
java.lang.UnsupportedOperationException
unveränderliche Listen aus (z. B. erstellt mitArrays.asList
). Weitere Informationen finden Sie in dieser Antwort .quelle
List.removeAll()
ist n ^ 2 . Nur sagen.O(n)
mir für beideArrayList
undLinkedList
.contains()
das gesamte Array durchläuft ) und da diessingleton
nur ein Element istN * 1 = N
. Im Allgemeinen wäre es jedoch soN^2
.Ab 2015 ist dies der beste Weg (Java 8):
Hinweis: Dieser Code wird
java.lang.UnsupportedOperationException
für Listen mit fester Größe (z. B. mit Arrays.asList erstellt) einschließlich unveränderlicher Listen ausgegeben.quelle
removeIf
das schneller ist, aber es ist eine Vermutung.Arrays.asList
ist nicht unveränderlich . Es hat eine feste Größe.quelle
Nicht effizient, aber kurz
quelle
Wenn Sie unveränderliche Datenobjekte bevorzugen oder die Eingabeliste nicht destruktiv beeinflussen möchten, können Sie die Prädikate von Guava verwenden.
quelle
quelle
removeAll(..null..)
. Vielen Dank!Vor Java 8 sollten Sie Folgendes verwenden:
Verwendung nach Java 8:
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:
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.
Während dies vernünftig erscheint, ruft die .remove () auf dem Iterator intern auf:
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:
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.
quelle
Es gibt eine einfache Möglichkeit, alle
null
Werte aus zucollection
entfernen. Sie müssen eine Auflistung mit null als Parameter an dieremoveAll()
Methode übergebenquelle
Die
Objects
Klasse hat einenonNull
Predicate
, mit der verwendet werden kannfilter
.Beispielsweise:
quelle
Mit Java 8 können Sie dies mit
stream()
und tunfilter()
oder
Für weitere Informationen: Java 8 - Streams
quelle
Dies ist eine einfache Möglichkeit, Standard-Nullwerte aus der Arrayliste zu entfernen
Andernfalls wird der Zeichenfolgenwert "null" aus der Arrayliste entfernt
quelle
Ich habe damit herumgespielt und herausgefunden, dass trimToSize () zu funktionieren scheint. Ich arbeite an der Android-Plattform, daher könnte es anders sein.
quelle
trimToSize
nicht den Inhalt von aArrayList
. Wenn dies in Android anders ist, ist es wahrscheinlich ein Fehler.Wir können den Iterator für denselben verwenden, um alle Nullwerte zu entfernen.
quelle
Ich habe die Stream-Schnittstelle zusammen mit der Stream-Operation Collect und einer Hilfsmethode verwendet, um eine neue Liste zu erstellen .
quelle
tourists.stream().filter(s -> s != null).collect(Collectors.toList());
Hauptsächlich benutze ich das:
Aber nachdem ich Java 8 gelernt hatte, wechselte ich zu folgendem:
quelle
Mit Java 8 kann dies auf verschiedene Arten mithilfe von Streams, parallelen Streams und
removeIf
Methoden durchgeführt werden:Der parallele Stream verwendet verfügbare Prozessoren und beschleunigt den Prozess für Listen mit angemessener Größe. Es ist immer ratsam, vor der Verwendung von Streams ein Benchmarking durchzuführen.
quelle
Ähnlich wie bei der Antwort von @Lithium, aber es wird kein Fehler "Liste darf keinen Typ null enthalten" ausgegeben:
quelle
quelle