Mam ArrayList<String>
i chcę usunąć z niego powtarzające się ciągi. W jaki sposób mogę to zrobić?
java
list
collections
arraylist
duplicates
użytkownik25778
źródło
źródło
public Set<Object> findDuplicates(List<Object> list) { Set<Object> items = new HashSet<Object>(); Set<Object> duplicates = new HashSet<Object>(); for (Object item : list) { if (items.contains(item)) { duplicates.add(item); } else { items.add(item); } } return duplicates; }
List
iSet
(zamiast typów implementacjiArrayList
iHashSet
jak w twoim przykładzie).new HashSet(al)
zamiast inicjować w celu opróżnienia i wywołaniaaddAll
.Object
ma kilka wartości, jeśli dwie z nich się powtarzają, uważam je za duplikaty (inne wartości mogą być różne) i używamSet
?Że pomimo iż przeliczenie
ArrayList
DoHashSet
skutecznie usuwa duplikaty, jeśli trzeba zachować kolejność wstawiania, wolałbym proponuję użyć tego wariantuNastępnie, jeśli musisz odzyskać
List
referencję, możesz ponownie użyć konstruktora konwersji.źródło
W Javie 8:
Należy pamiętać, że aby elementy filtrujące działały poprawnie, należy przestrzegać umowy hashCode-equals dla członków listy.
źródło
addAll
donew TreeSet<String>(String.CASE_INSENSITIVE_ORDER)
. Pierwszy dodany element pozostanie w zestawie, więc jeśli twoja lista zawiera „Pies” i „Pies” (w tej kolejności),TreeSet
będzie zawierać „Pies”. Jeśli trzeba zachować porządek, to przed wierszem w odpowiedzi umieścićlist.replaceAll(String::toUpperCase);
.Załóżmy, że mamy listę
String
takich jak:Następnie możemy usunąć duplikaty elementów na wiele sposobów.
Przed Javą 8
Uwaga: jeśli chcemy zachować kolejność wstawiania, musimy użyć
LinkedHashSet
zamiastHashSet
Korzystanie z guawy
Korzystanie z Java 8
Uwaga: W przypadku, gdy chcemy zebrać wynik w konkretnej implementacji listy, np.
LinkedList
Możemy zmodyfikować powyższy przykład jako:Możemy użyć
parallelStream
również w powyższym kodzie, ale może nie dać oczekiwanych korzyści w zakresie wydajności. Sprawdź to pytanie, aby uzyskać więcej.źródło
parallel streams
zawsze da lepszą wydajność. Ale to mit. Później dowiedziałem się, że istnieją pewne scenariusze, w których należy stosować strumienie równoległe. W tym scenariuszu równoległe strumienie nie poprawią wydajności. i tak równoległe strumienie mogą w niektórych przypadkach nie dać pożądanych rezultatów.List<String> deDupStringList3 = stringList.stream().map(String::toLowerCase).distinct().collect(Collectors.toList());
powinno być odpowiednim rozwiązaniem w tym przypadkuJeśli nie chcesz duplikatów, użyj zestawu zamiast
List
. Aby przekonwertowaćList
na aSet
, możesz użyć następującego kodu:Jeśli to naprawdę konieczne, możesz użyć tej samej konstrukcji, aby przekształcić z
Set
powrotem w plikList
.źródło
Set
nie można go tutaj użyć.Możesz to zrobić w ten sposób i zachować porządek:
źródło
Strumienie Java 8 zapewniają bardzo prosty sposób usuwania zduplikowanych elementów z listy. Używając odrębnej metody. Jeśli mamy listę miast i chcemy usunąć duplikaty z tej listy, można to zrobić w jednym wierszu -
Jak usunąć zduplikowane elementy z tablicy arraylist
źródło
Oto sposób, który nie wpływa na porządkowanie listy:
l1 to oryginalna lista, a l2 to lista bez powtarzających się elementów (upewnij się, że twoja klasa ma metodę równości zgodnie z tym, co chcesz stać na równości)
źródło
ArrayList<T>
należy użyć zamiastArrayList
) 2) Można uniknąć jawnego tworzenia iteratora za pomocąfor (T current : l1) { ... }
. Nawet jeśli chcesz użyćIterator
jawnie,iterador
jest źle napisane.Możliwe jest usunięcie duplikatów z tablicy arraylist bez użycia HashSet lub jeszcze jednej tablicy arraylist .
Wypróbuj ten kod ..
Dane wyjściowe to
źródło
ImmutableSet.copyOf(lst).toList()
.indexOf
iterujelst
użycie pętli for.Istnieje również opcja
ImmutableSet
z Guawy ( tutaj jest dokumentacja):źródło
ImmutableSet.asList()
metoda zwracającaImmutableList
, jeśli potrzebujesz go z powrotem jakoList
.może to rozwiązać problem:
źródło
Prawdopodobnie trochę przesada, ale podoba mi się ten rodzaj odosobnionego problemu. :)
Ten kod używa zestawu tymczasowego (do kontroli unikalności), ale usuwa elementy bezpośrednio z oryginalnej listy. Ponieważ usuwanie elementów wewnątrz tablicy ArrayList może spowodować ogromną ilość kopiowania tablicy, unika się metody remove (int).
Skoro już o tym mowa, oto wersja LinkedList (o wiele ładniejsza!):
Użyj interfejsu znaczników, aby przedstawić ujednolicone rozwiązanie dla listy:
EDYCJA: Wydaje mi się, że rzeczy ogólne nie dodają tutaj żadnej wartości .. No cóż. :)
źródło
źródło
Jeśli chcesz korzystać z biblioteki innej firmy, możesz użyć tej metody
distinct()
w Eclipse Collections (wcześniej GS Collection).Zaletą używania
distinct()
zamiast konwersji do zestawu, a następnie powrotu do listy jest to, żedistinct()
zachowuje kolejność oryginalnej listy, zachowując pierwsze wystąpienie każdego elementu. Jest realizowany przy użyciu zarówno zestawu, jak i listy.Jeśli nie możesz przekonwertować oryginalnej listy na typ kolekcji Eclipse, możesz użyć ListAdapter, aby uzyskać ten sam interfejs API.
Uwaga: jestem osobą odpowiedzialną za kolekcje Eclipse.
źródło
Te trzy wiersze kodu mogą usunąć zduplikowany element z ArrayList lub dowolnej kolekcji.
źródło
Podczas wypełniania ArrayList użyj warunku dla każdego elementu. Na przykład:
Otrzymamy tablicę {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
źródło
Jeśli chcesz zachować swoje zamówienie, najlepiej użyć LinkedHashSet . Ponieważ jeśli chcesz przekazać tę listę do zapytania wstawiania poprzez iterację, kolejność zostanie zachowana.
Spróbuj tego
Ta konwersja będzie bardzo pomocna, jeśli chcesz zwrócić listę, ale nie zestaw.
źródło
Kod:
Uwaga: Zdecydowanie będzie narzut pamięci.
źródło
źródło
LinkedHashSet załatwi sprawę.
// wynik: 5,1,2,3,4
źródło
źródło
Służy to do listy obiektów niestandardowych
źródło
możesz użyć zagnieżdżonej pętli w następujący sposób:
źródło
Jak powiedziano wcześniej, powinieneś użyć klasy implementującej interfejs Set zamiast List, aby mieć pewność, że elementy są wyjątkowe. Jeśli musisz zachować kolejność elementów, możesz użyć interfejsu SortedSet; klasa TreeSet implementuje ten interfejs.
źródło
Jeśli używasz modelu typu List <T> / ArrayList <T>. Mam nadzieję, że ci pomoże.
Oto mój kod bez użycia jakiejkolwiek innej struktury danych, takiej jak set lub hashmap
źródło
źródło
źródło
źródło
źródło
Jeśli chcesz usunąć duplikaty z ArrayList oznacza znaleźć poniższą logikę,
źródło