Jak utworzyć listę unikalnych / odrębnych obiektów (bez duplikatów) w Javie?
W tej chwili używam HashMap<String, Integer>
do tego, ponieważ klucz jest nadpisywany i dlatego na końcu możemy uzyskać HashMap.getKeySet()
unikatowy. Ale jestem pewien, że powinien być lepszy sposób, aby to zrobić, ponieważ część wartości jest tutaj marnowana.
źródło
Chcę tutaj wyjaśnić kilka rzeczy dotyczących oryginalnego plakatu, do których inni nawiązywali, ale tak naprawdę nie powiedzieli tego wyraźnie. Kiedy mówisz, że chcesz mieć unikalną listę, jest to definicja uporządkowanego zestawu. Niektóre inne kluczowe różnice między interfejsem Set a interfejsem List polegają na tym, że List umożliwia określenie indeksu wstawiania. Zatem pytanie brzmi, czy naprawdę potrzebujesz interfejsu listy (np. W celu zapewnienia zgodności z biblioteką innej firmy itp.), Czy też możesz przeprojektować swoje oprogramowanie, aby korzystało z interfejsu Set? Musisz także wziąć pod uwagę, co robisz z interfejsem. Czy ważne jest, aby znajdować elementy według ich indeksu? Ile elementów spodziewasz się w swoim zestawie? Jeśli będziesz mieć wiele elementów, czy zamawianie jest ważne?
Jeśli naprawdę potrzebujesz listy, która ma tylko unikalne ograniczenie, istnieje klasa Apache Common Utils org.apache.commons.collections.list.SetUniqueList, która zapewni Ci interfejs List i unikalne ograniczenie. Pamiętaj, że psuje to interfejs List. Uzyskasz jednak lepszą wydajność, jeśli będziesz musiał przeszukiwać listę według indeksu. Jeśli możesz sobie poradzić z interfejsem Set i masz mniejszy zestaw danych, to LinkedHashSet może być dobrym rozwiązaniem. Zależy to tylko od projektu i przeznaczenia oprogramowania.
Znowu każda kolekcja ma pewne zalety i wady. Niektóre szybkie wstawienia, ale powolne odczyty, niektóre mają szybkie odczyty, ale powolne wstawienia, itp. Warto spędzić sporo czasu z dokumentacją kolekcji, aby w pełni poznać szczegóły każdej klasy i interfejsu.
źródło
Użyj
new HashSet<String>
przykładu:źródło
Możesz po prostu użyć a,
HashSet<String>
aby zachować kolekcję unikalnych obiektów. JeśliInteger
wartości na mapie są ważne, możesz zamiast tego użyćcontainsKey
metody map, aby sprawdzić, czy klucz znajduje się już na mapie.źródło
HashSet<String>
(lub) dowolnaSet
implementacja może wykonać zadanie za Ciebie.Set
nie zezwalaj na duplikaty.Oto javadoc dla HashSet.
źródło
Nie wiem, na ile to wydajne, jednak zadziałało dla mnie w prostym kontekście.
źródło
Możesz chcieć użyć jednej z klas implementujących
java.util.Set<E>
Interface, npjava.util.HashSet<String>
. Klasy kolekcji.źródło