Próbuję z taką pętlą
// ArrayList tourists
for (Tourist t : tourists) {
if (t != null) {
t.setId(idForm);
}
}
Ale to nie jest miłe. Czy ktoś może zaproponować mi lepsze rozwiązanie?
Kilka przydatnych wskaźników, które pomogą podjąć lepszą decyzję:
Iterator
? Dig java-doc. download.oracle.com/javase/6/docs/api/java/util/…Odpowiedzi:
Próbować:
Przeczytaj API Java . Kod będzie rzucał
java.lang.UnsupportedOperationException
dla niezmiennych list (takich jak utworzone przy pomocyArrays.asList
); zobacz tę odpowiedź, aby uzyskać więcej informacji.źródło
List.removeAll()
wynosi n ^ 2 . Tylko mówię.O(n)
do mnie zarównoArrayList
iLinkedList
.contains()
zapętla całą tablicę), a ponieważsingleton
jest to tylko jeden elementN * 1 = N
. Jakkolwiek ogólnie by tak byłoN^2
.W 2015 r. Jest to najlepszy sposób (Java 8):
Uwaga: ten kod będzie
java.lang.UnsupportedOperationException
wyświetlał listy o stałym rozmiarze (takie jak utworzone za pomocą Arrays.asList), w tym niezmienne listy.źródło
removeIf
jest to szybsze, ale to przypuszczenie.Arrays.asList
nie jest niezmienny . Ma stały rozmiar.źródło
Nie wydajny, ale krótki
źródło
Jeśli wolisz niezmienne obiekty danych lub po prostu nie chcesz być destrukcyjny dla listy danych wejściowych, możesz użyć predykatów Guavy.
źródło
źródło
removeAll(..null..)
. Dzięki!Przed wersją Java 8 powinieneś używać:
Użycie po wersji Java 8:
Powodem jest złożoność czasu. Problem z tablicami polega na tym, że operacja usunięcia może zająć O (n) czasu. Naprawdę w Javie jest to tablica kopii pozostałych elementów przenoszonych w celu zastąpienia pustego miejsca. Wiele innych rozwiązań tutaj oferowanych spowoduje ten problem. Ten pierwszy jest technicznie O (n * m), gdzie m wynosi 1, ponieważ jest singletonem zerowym: więc O (n)
Powinieneś usunąćAll z singletonu, wewnętrznie robi on batchRemove (), który ma pozycję odczytu i pozycję zapisu. I iteruje listę. Kiedy osiągnie wartość zerową, po prostu iteruje pozycję odczytu o 1. Gdy są one takie same, mija, kiedy są różne, przesuwa się dalej, kopiując wartości. Następnie na końcu przycina się do rozmiaru.
Skutecznie robi to wewnętrznie:
To, co wyraźnie widać, to operacja O (n).
Jedyną rzeczą, która mogłaby być szybsza, jest iteracja listy z obu końców, a po znalezieniu wartości null ustawia się jej wartość równą wartości znalezionej na końcu i zmniejsza tę wartość. I iterował, aż obie wartości się zgadzały. Zepsujesz porządek, ale znacznie zmniejszysz liczbę ustawionych wartości w porównaniu z wartościami, które pozostawiłeś sam. Co jest dobrą metodą na poznanie, ale tutaj niewiele pomoże, ponieważ .set () jest w zasadzie darmowy, ale ta forma usuwania jest przydatnym narzędziem dla twojego paska.
Chociaż wydaje się to rozsądne, funkcja .remove () iteratora wywołuje wewnętrznie:
To znowu operacja O (n) w usuwaniu. Robi System.arraycopy (), który znowu nie jest tym, czego chcesz, jeśli zależy ci na szybkości. To sprawia, że n ^ 2.
Jest także:
Który jest O (m * n ^ 2). Tutaj nie tylko iterujemy listę. Powtarzamy całą listę za każdym razem, gdy dopasowujemy zero. Następnie wykonujemy n / 2 (przeciętne) operacje, aby wykonać System.arraycopy () w celu wykonania operacji usuwania. Można dosłownie posortować całą kolekcję między elementami o wartościach i elementami o wartościach zerowych i przyciąć zakończenie w krótszym czasie. W rzeczywistości dotyczy to wszystkich zepsutych. Przynajmniej teoretycznie faktyczny system. Arraycopy nie jest w rzeczywistości operacją N. Teoretycznie teoria i praktyka są tym samym; w praktyce nie są.
źródło
Istnieje prosty sposób usunięcia wszystkich
null
wartości z.collection
Musisz przekazać kolekcję zawierającą null jako parametr doremoveAll()
metodyźródło
Objects
Klasa manonNull
Predicate
, że może być stosowany zfilter
.Na przykład:
źródło
Korzystając z Java 8, możesz to zrobić za pomocą
stream()
ifilter()
lub
Więcej informacji: Java 8 - Strumienie
źródło
Jest to prosty sposób na usunięcie domyślnych wartości zerowych z listy arraylist
w przeciwnym razie wartość ciągu „null” usuń z tablicy
źródło
Bawiłem się tym i dowiedziałem się, że trimToSize () wydaje się działać. Pracuję na platformie Android, więc może być inaczej.
źródło
trimToSize
nie modyfikuje zawartościArrayList
. Jeśli jest inaczej w Androidzie, prawdopodobnie jest to błąd.Możemy użyć iteratora do tego samego, aby usunąć wszystkie wartości null.
źródło
Użyłem interfejsu strumienia wraz z kolekcjonowaniem operacji strumienia i metodą pomocniczą do wygenerowania nowej listy.
źródło
tourists.stream().filter(s -> s != null).collect(Collectors.toList());
Głównie używam tego:
Ale kiedy nauczyłem się Java 8, przerzuciłem się na to:
źródło
Za pomocą Java 8 można to zrobić na różne sposoby, używając strumieni, równoległych strumieni i
removeIf
metody:Strumień równoległy wykorzysta dostępne procesory i przyspieszy proces dla list o rozsądnych rozmiarach. Zawsze zaleca się przeprowadzenie testu porównawczego przed użyciem strumieni.
źródło
Podobne do odpowiedzi @Lithium, ale nie generuje błędu „Lista nie może zawierać typu null”:
źródło
źródło