.AsSet (…) esiste in qualche API?


Risposte:


84

Ora con Java 8 puoi farlo senza bisogno di framework di terze parti:

Set<String> set = Stream.of("a","b","c").collect(Collectors.toSet());

Vedi Collezionisti .

Godere!


4
Al giorno d'oggi con Java 8 questa è probabilmente la risposta migliore perché non dipende da librerie di terze parti e può essere facilmente adattata ad altri tipi di raccolte, quindi lo sto impostando come accettato. Mille grazie a tutti per le altre fantastiche soluzioni. (a proposito, questo set è modificabile)
cahen

3
Ora, chi ha detto che Java era troppo prolisso? Ovviamente questa è la risposta migliore!
BobDoolittle

Grazie mille @BobDoolittle!
Mr. Anderson

2
Per chiunque utilizzi java 9+, vedere anche la risposta di Holly di seguito: stackoverflow.com/a/48025159/229743
Taylor

1
risposta impeccabile Mr. Anderson!
gaurav

63

Usando Guava , è così semplice:

Set<String> mySet = ImmutableSet.<String> of("a", "b");

O per un set mutevole:

Set<String> mySet = Sets.newHashSet("a", "b")

Per altri tipi di dati vedere la guida utente Guava


Esiste una versione non immutabile di questo?
cahen

3
@cahen yes: Sets.newHashSet("a", "b")orSets.newLinkedHashSet("a", "b")
Sean Patrick Floyd

1
Ho aggiunto una variante mutevole alla risposta.
Michael Schmeißer

in realtà, Sets.newLinkedHashSet()non esiste con quella firma, mi dispiace
Sean Patrick Floyd

Sono stato in grado di rimuovere uno degli argomenti del tipo:Set<String> mySet = ImmutableSet.of("a", "b");
joshden

55

Potresti usare

new HashSet<String>(Arrays.asList("a","b"));

Preferirei farlo quindi utilizzare la versione stream. Posso semplicemente importare staticamente "asList", rendendolo ancora meno dettagliato.
Marcio Lucca

24

Per i casi speciali di insiemi con zero o un membro, è possibile utilizzare:

java.util.Collections.EMPTY_SET

e:

java.util.Collections.singleton("A")

per questi casi speciali, è probabilmente la soluzione migliore in quanto utilizza l'API java.util standard
arcuri82

2
java.util.Collections.emptySet()è, a mio avviso, preferito rispetto a EMPTY_SET, a causa della sicurezza dei tipi. Dai commenti nella classe Collezioni:Unlike the like-named field, this method is parameterized.
Eddified

17

Come altri hanno già detto, usa:

new HashSet<String>(Arrays.asList("a","b"));

Il motivo per cui questo non esiste in Java è che Arrays.asListrestituisce un elenco di dimensioni fisse, in altre parole:

public static void main(String a[])
{
  List<String> myList = Arrays.asList("a", "b");
  myList.add("c");
}

Ritorna:

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(Unknown Source)
    at java.util.AbstractList.add(Unknown Source)

Non esiste un'implementazione JDK di una "dimensione fissa" Setall'interno della Arraysclasse. Perché vuoi questo? A Setgarantisce che non ci siano duplicati, ma se li stai digitando a mano, non dovresti aver bisogno di quella funzionalità ... e Listha più metodi. Entrambe le interfacce estendono Collectione Iterable.


Come altri hanno già detto, usa guava se vuoi davvero questa funzionalità, poiché non è nel JDK. Guarda le loro risposte (in particolare la risposta di Michael Schmeißer) per informazioni al riguardo.


3
Questa è la risposta migliore fino ad ora, perché indica cosa fa effettivamente Arrays.asList (). Molti sviluppatori sembrano credere che Arrays.asList () crei un java.util.ArrayList, mentre in realtà crea un java.util.Arrays $ ArrayList (che è solo parzialmente modificabile e una visualizzazione live dell'array sottostante)
Sean Patrick Floyd

1
Per quanto riguarda il motivo per cui qualcuno vorrebbe farlo, il motivo più comune per costruire un Set (o List) a mano è in una classe di test in cui si passano i valori di test.
Scott McIntyre

14

In Java 9, una funzione simile è stata aggiunta tramite metodi di fabbrica:

Set<String> oneLinerSet = Set.of("a", "b", ...);

(Ci sono anche equivalenti per List.)


Ho provato questo e ho ricevuto un avviso dal compilatore che questo non è un metodo API.
Philippe Gioseffi

Ecco il documento java pertinente: docs.oracle.com/javase/9/docs/api/java/util/Set.html . Oltre a utilizzare un JDK Java 9+, potrebbe essere necessario regolare l'IDE o lo strumento di compilazione per utilizzare la conformità a Java 9 (ad esempio, per Maven, sarebbero passaggi simili a quelli qui, ma impostati su 1.9: stackoverflow.com/ domande / 16798066 /… )
Holly Cummins

Vorrei poter usare Java 9 .. Viviamo nel passato! :(
jDub9

va bene, ma hanno alcune restrizioni sulla dimensione degli argomenti ...
Radoslav Ivanov



2

Ecco un piccolo metodo che puoi usare

  /**
   * 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));
  }

1

Un altro modo per farlo usando Java 8 e le enumerazioni sarebbe:

Set<String> set = EnumSet.of(StandardOpenOption.CREATE, StandardOpenOption.READ);

Vedi EnumSet .

Suggerirei un'analisi delle prestazioni tra questo approccio e

Set<String> set = Stream.of(StandardOpenOption.CREATE, StandardOpenOption.READ).collect(Collectors.toSet());

perché se hai più di cinque elementi il ​​javadoc del metodo afferma che potrebbero essere problemi di prestazioni come puoi vedere nel javadoc di Set.Of (E, E ...) .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.