Szukam bardzo prostego sposobu na stworzenie Zestawu.
Arrays.asList("a", "b" ...)
tworzy plik List<String>
Czy jest coś podobnego do Set
?
Szukam bardzo prostego sposobu na stworzenie Zestawu.
Arrays.asList("a", "b" ...)
tworzy plik List<String>
Czy jest coś podobnego do Set
?
Odpowiedzi:
Teraz dzięki Java 8 możesz to zrobić bez konieczności korzystania z platformy zewnętrznej:
Set<String> set = Stream.of("a","b","c").collect(Collectors.toSet());
Zobacz Kolekcjonerzy .
Cieszyć się!
Korzystanie z guawy jest takie proste:
Set<String> mySet = ImmutableSet.<String> of("a", "b");
Lub dla zmiennego zestawu:
Set<String> mySet = Sets.newHashSet("a", "b")
Więcej typów danych można znaleźć w podręczniku użytkownika Guava
Sets.newHashSet("a", "b")
lubSets.newLinkedHashSet("a", "b")
Sets.newLinkedHashSet()
nie istnieje z tym podpisem, przepraszam
Set<String> mySet = ImmutableSet.of("a", "b");
Możesz użyć
new HashSet<String>(Arrays.asList("a","b"));
W szczególnych przypadkach zestawów z zerowym lub jednym składnikiem możesz użyć:
java.util.Collections.EMPTY_SET
i:
java.util.Collections.singleton("A")
java.util.Collections.emptySet()
jest moim zdaniem preferowany względem EMPTY_SET ze względu na bezpieczeństwo typów. Z komentarzy w klasie Kolekcje:Unlike the like-named field, this method is parameterized.
Jak powiedzieli inni, użyj:
new HashSet<String>(Arrays.asList("a","b"));
Powodem tego, że nie istnieje w Javie, jest to, że Arrays.asList
zwraca listę o stałym rozmiarze, innymi słowy:
public static void main(String a[])
{
List<String> myList = Arrays.asList("a", "b");
myList.add("c");
}
Zwroty:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(Unknown Source)
at java.util.AbstractList.add(Unknown Source)
Nie ma realizacja JDK o „stałej wielkości” Set
wewnątrz Arrays
klasy. Dlaczego tego chcesz? A Set
gwarantuje, że nie ma duplikatów, ale jeśli wpisując je ręcznie, nie ma potrzeby tej funkcjonalności ... i List
ma więcej metod. Oba interfejsy rozszerzają Collection
i Iterable
.
Jak powiedzieli inni, użyj guawy, jeśli naprawdę chcesz tej funkcji - ponieważ nie ma jej w JDK. Sprawdź ich odpowiedzi (w szczególności odpowiedź Michaela Schmeißera), aby uzyskać informacje na ten temat.
W Javie 9 podobna funkcja została dodana metodami fabrycznymi:
Set<String> oneLinerSet = Set.of("a", "b", ...);
(Istnieją również odpowiedniki dla List
.)
Nie, ale możesz to zrobić w ten sposób
new HashSet<String>(Arrays.asList("a", "b", ...));
Oto mała metoda, której możesz użyć
/**
* Utility method analogous to {@link java.util.Arrays#asList(Object[])}
*
* @param ts
* @param <T>
* @return the set of all the parameters given.
*/
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> Set<T> asSet(T... ts) {
return new HashSet<>(Arrays.asList(ts));
}
Innym sposobem na zrobienie tego za pomocą Java 8 i wyliczeń byłoby:
Set<String> set = EnumSet.of(StandardOpenOption.CREATE, StandardOpenOption.READ);
Zobacz EnumSet .
Poleciłbym analizę wydajności między tym podejściem a
Set<String> set = Stream.of(StandardOpenOption.CREATE, StandardOpenOption.READ).collect(Collectors.toSet());
ponieważ jeśli masz więcej niż pięć elementów, javadoc metody stwierdza, że mogą to być problemy z wydajnością, jak widać w javadoc Set.Of (E, E ...) .