Gostaria de converter uma matriz para um conjunto em Java. Existem algumas maneiras óbvias de fazer isso (por exemplo, com um loop), mas eu gostaria de algo um pouco mais limpo, algo como:
java.util.Arrays.asList(Object[] a);
Alguma ideia?
java
collections
arrays
set
Bob Gilmore
fonte
fonte
Arrays.asList
é O (1).Isso é Collections.addAll (java.util.Collection, T ...) do JDK 6.
Além disso: e se a nossa matriz estiver cheia de primitivas?
Para JDK <8, eu apenas escreveria o
for
loop óbvio para fazer o wrap e adicionar ao conjunto em uma única passagem.Para JDK> = 8, uma opção atraente é algo como:
fonte
java.util.Collections.addAll
. Além disso, eu não recomendaria mais o Commons Collections, o que significa que ele não é gerado e existe a Goiaba.addAll
que será O ( n ).Com o Goiaba, você pode fazer:
fonte
new HashSet<T>(Arrays.asList(someArray))
. Veja google.github.io/guava/releases/19.0/api/docs/com/google/common/…Java 8:
fonte
Varargs também funcionará!
fonte
Java 8
Temos a opção de usar
Stream
também. Podemos transmitir de várias maneiras:O código fonte
Collectors.toSet()
mostra que os elementos são adicionados um a um a uma,HashSet
mas a especificação não garante que será aHashSet
.Portanto, é melhor usar a opção posterior. A saída é:
[A, B, C, D] [A, B, C, D] [A, B, C, D]
Conjunto Imutável (Java 9)
O Java 9 introduziu o
Set.of
método estático de fábrica que retorna um conjunto imutável para os elementos fornecidos ou a matriz.Consulte Métodos de fábrica estática de conjunto imutável para obter detalhes.
Conjunto Imutável (Java 10)
Também podemos obter um conjunto imutável de duas maneiras:
Set.copyOf(Arrays.asList(array))
Arrays.stream(array).collect(Collectors.toUnmodifiableList());
O método
Collectors.toUnmodifiableList()
utiliza internamente oSet.of
introduzido no Java 9. Verifique também esta minha resposta para obter mais informações.fonte
Stream.of()
- eu não conhecia esse. Uma pequena discussão sobreCollectors.toSet()
: você diz que a especificação não garante a adição de elementos um por um, mas é isso que significa: "acumula ... em um novoSet
". E é mais legível - tão preferível para mim, se você não precisar das garantias de tipo concreto, mutabilidade, serialização e segurança de rosca.HashSet
. Apenas garante que será umSet
e é isso que quero dizer. Espero ter esclarecido.Depois que
Arrays.asList(array)
você pode executarSet set = new HashSet(list);
Aqui está um método de amostra, você pode escrever:
fonte
Nas Coleções Eclipse , o seguinte funcionará:
Nota: Eu sou um confirmador das Coleções Eclipse
fonte
Rapidamente: você pode fazer:
e reverter
fonte
Eu escrevi o abaixo com os conselhos acima - roube-o ... é legal!
fonte
Tem havido uma série de grandes respostas já, mas a maioria deles não funcionará com matriz de primitivos (como
int[]
,long[]
,char[]
,byte[]
, etc.)No Java 8 e acima, você pode encaixar a matriz com:
Em seguida, converta para definir usando stream:
fonte
Às vezes, usar algumas bibliotecas padrão ajuda muito. Tente olhar para as coleções Apache Commons . Nesse caso, seus problemas são simplesmente transformados em algo assim
E aqui está o javadoc do CollectionsUtils
fonte
java.util.Collections.addAll(myEmptySet, keys);
??Use
CollectionUtils
ouArrayUtils
destanford-postagger-3.0.jar
fonte
No Java 10 :
Set.copyOf
retorna um não modificávelSet
contendo os elementos do dadoCollection
.O dado
Collection
não deve sernull
e não deve conter nenhumnull
elemento.fonte
a saída é
mude para
a saída é
fonte
Para quem resolve o Android:
Solução Kotlin Collections
O asterisco
*
é ospread
operador. Aplica todos os elementos em uma coleção individualmente, cada um passado para umvararg
parâmetro de método. É equivalente a:Não passar parâmetros
setOf()
resulta em um conjunto vazio.Além disso
setOf
, você também pode usar qualquer um destes para um tipo de hash específico:É assim que define o tipo de item de coleção explicitamente.
fonte
new HashSet<Object>(Arrays.asList(Object[] a));
Mas acho que isso seria mais eficiente:
fonte
HashSet
é definida com base no tamanho da matriz, por exemplo.fonte