Chciałbym przekonwertować tablicę na zestaw w Javie. Istnieje kilka oczywistych sposobów na zrobienie tego (np. Za pomocą pętli), ale chciałbym coś bardziej schludnego, na przykład:
java.util.Arrays.asList(Object[] a);
Jakieś pomysły?
java
collections
arrays
set
Bob Gilmore
źródło
źródło
Arrays.asList
oznacza O (1).To jest Collection.addAll (java.util.Collection, T ...) z JDK 6.
Dodatkowo: co jeśli nasza tablica jest pełna prymitywów?
Dla JDK <8 po prostu napisałbym oczywistą
for
pętlę, aby wykonać zawijanie i dodawanie do zestawu w jednym przebiegu.Dla JDK> = 8 atrakcyjną opcją jest coś takiego:
źródło
java.util.Collections.addAll
. Poza tym nie polecałbym już kolekcji Commons, co nie jest generowane, a Guava istnieje.addAll
będzie O ( n ).Z Guava możesz:
źródło
new HashSet<T>(Arrays.asList(someArray))
. Zobacz google.github.io/guava/releases/19.0/api/docs/com/google/common/…Java 8:
źródło
Varargs też będzie działać!
źródło
Java 8
Mamy również opcję korzystania
Stream
. Możemy uzyskać strumień na różne sposoby:Kod źródłowy
Collectors.toSet()
pokazuje, że elementy są dodawane jeden po drugim,HashSet
ale specyfikacja nie gwarantuje, że będzie toHashSet
.Lepiej więc użyć późniejszej opcji. Dane wyjściowe to:
[A, B, C, D] [A, B, C, D] [A, B, C, D]
Niezmienny zestaw (Java 9)
Java 9 wprowadziła
Set.of
statyczną metodę fabryczną, która zwraca niezmienny zestaw dla dostarczonych elementów lub tablicy.Sprawdź szczegółowe informacje na temat niezmiennych metod statycznych .
Niezmienny zestaw (Java 10)
Możemy również uzyskać niezmienny zestaw na dwa sposoby:
Set.copyOf(Arrays.asList(array))
Arrays.stream(array).collect(Collectors.toUnmodifiableList());
Ta metoda
Collectors.toUnmodifiableList()
korzysta z metody wewnętrznejSet.of
wprowadzonej w Javie 9. Sprawdź także moją odpowiedź, aby uzyskać więcej.źródło
Stream.of()
- nie znałem tego. Mały spór oCollectors.toSet()
: mówisz, że specyfikacja nie gwarantuje dodawania elementów jeden po drugim, ale to właśnie oznacza: „kumuluje się ... w nowySet
”. I jest bardziej czytelny - tak uważam, jeśli nie potrzebujesz gwarancji konkretnego typu, zmienności, możliwości serializacji i bezpieczeństwa wątków.HashSet
. To tylko gwarantuje, że będzie toSet
i właśnie o to mi chodzi. Mam nadzieję, że to wyjaśniłem.Po zakończeniu możesz
Arrays.asList(array)
wykonaćSet set = new HashSet(list);
Oto przykładowa metoda, którą możesz napisać:
źródło
W kolekcji Eclipse działają następujące elementy:
Uwaga: jestem osobą odpowiedzialną za kolekcje Eclipse
źródło
Szybko: możesz:
i odwrócić
źródło
Napisałem poniżej z powyższej porady - ukraść to ... to miłe!
źródło
Odnotowano wiele wspaniałych odpowiedzi już, ale większość z nich nie będzie działać z tablicy prymitywów (jak
int[]
,long[]
,char[]
,byte[]
, itd.)W Javie 8 i nowszych możesz umieścić tablicę w pudełku za pomocą:
Następnie przekonwertuj na zestaw za pomocą strumienia:
źródło
Kiedyś korzystanie ze standardowych bibliotek bardzo pomaga. Spróbuj spojrzeć na Kolekcje Apache Commons . W takim przypadku Twoje problemy są po prostu przekształcane w coś takiego
A oto javadoc CollectionsUtils
źródło
java.util.Collections.addAll(myEmptySet, keys);
??Użyj
CollectionUtils
lubArrayUtils
zstanford-postagger-3.0.jar
źródło
W Javie 10 :
Set.copyOf
zwraca niemodyfikowalnąSet
zawierającą elementy danegoCollection
.Podane
Collection
nie może byćnull
i nie może zawierać żadnychnull
elementów.źródło
wyjście jest
zmień na
wyjście jest
źródło
Dla każdego, kto rozwiązuje problem dla Androida:
Rozwiązanie Kotlin Collections
Gwiazdką
*
jestspread
operator. Stosuje wszystkie elementy w kolekcji osobno, każdy przekazany w celuvararg
parametru metody. Jest to równoważne z:Nieprzekazanie parametrów
setOf()
powoduje powstanie pustego zestawu.Oprócz tego
setOf
możesz użyć dowolnego z nich dla określonego typu skrótu:W ten sposób można jawnie zdefiniować typ elementu kolekcji.
źródło
new HashSet<Object>(Arrays.asList(Object[] a));
Ale myślę, że byłoby to bardziej wydajne:
źródło
HashSet
zestawu jest ustalana na przykład na podstawie rozmiaru tablicy.źródło