Quelle est la façon la plus simple de convertir List
un Set
en Java?
java
collections
OHHAI
la source
la source
Set
etMap
celle qui est utilisée;HashSet
est supposé ici.Je suis d'accord avec sepp2k, mais il y a d'autres détails qui pourraient être importants:
vous donnera un ensemble non trié qui n'a pas de doublons. Dans ce cas, la duplication est identifiée à l'aide de la méthode .equals () sur vos objets. Cela se fait en combinaison avec la méthode .hashCode (). (Pour en savoir plus sur l'égalité, regardez ici )
Une alternative qui donne un ensemble trié est:
Cela fonctionne si Foo implémente Comparable. Si ce n'est pas le cas, vous pouvez utiliser un comparateur:
Cela dépend de compareTo () (à partir de l'interface comparable) ou compare () (à partir du comparateur) pour garantir l'unicité. Donc, si vous vous souciez uniquement de l'unicité, utilisez le HashSet. Si vous êtes après le tri, pensez au TreeSet. (N'oubliez pas: optimisez plus tard!) Si l'efficacité du temps compte, utilisez un HashSet si l'efficacité de l'espace est importante, regardez TreeSet. Notez que des implémentations plus efficaces de Set et Map sont disponibles via Trove (et d'autres emplacements).
la source
Si vous utilisez la bibliothèque Guava :
ou mieux:
la source
ImmutableSet.of()
par exemple. EDIT: ce n'est peut-être pas un facteur car toutes les surcharges sont inutiles.En utilisant java 8, vous pouvez utiliser stream:
la source
ou exemple complet
la source
Je voudrais effectuer une vérification Null avant de convertir en set.
la source
Set<Foo> foo = myList == null ? Collections.emptySet() : new HashSet<Foo>(myList);
Vous pouvez convertir
List<>
enSet<>
la source
Pour Java 8, c'est très simple:
la source
new ArrayList<>()
;-)Java - addAll
Java - nouvel objet
Java-8
Utiliser Guva
Apache Commons
Java 10
la source
N'oublions pas notre ami relativement nouveau, java-8API de diffusion. Si vous avez besoin de prétraiter la liste avant de la convertir en un ensemble, il est préférable d'avoir quelque chose comme:
la source
La meilleure façon d'utiliser le constructeur
Dans java 8, vous pouvez également utiliser le flux api ::
la source
Il existe différentes façons d'obtenir un
Set
AS:Lorsque nous utilisons
Collectors.toSet()
renvoie un ensemble et selon la doc:There are no guarantees on the type, mutability, serializability, or thread-safety of the Set returned
. Si nous voulons en obtenir un,HashSet
nous pouvons utiliser l'autre alternative pour obtenir un ensemble (vérifierset3
).la source
Avec Java 10, vous pouvez désormais utiliser
Set#copyOf
pour convertir facilement unList<E>
en un non modifiableSet<E>
:Exemple:
Gardez à l'esprit qu'il s'agit d'une opération non ordonnée et que les
null
éléments ne sont pas autorisés, car cela entraînera unNullPointerException
.Si vous souhaitez qu'il soit modifiable, passez-le simplement au constructeur une
Set
implémentation.la source
Une solution plus résiliente Java 8 avec
Optional.ofNullable
la source
Si vous utilisez les collections Eclipse :
L'
MutableSet
interface s'étendjava.util.Set
alors que l'MutableIntSet
interface ne le fait pas. Vous pouvez également convertir n'importe quel fichierIterable
enSet
utilisant laSets
classe d'usine.Il y a plus d'explications sur les usines modifiables disponibles dans les collections Eclipse ici .
Si vous voulez un
ImmutableSet
de aList
, vous pouvez utiliser l'Sets
usine comme suit:Remarque: je suis un committer pour les collections Eclipse
la source
N'oubliez pas que la conversion de List en Set supprimera les doublons de la collection car List prend en charge les doublons mais Set ne prend pas en charge les doublons en Java.
Conversion directe: la façon la plus courante et la plus simple de convertir une liste en un ensemble
Collections Apache Commons: Vous pouvez également utiliser l'API Commons Collections pour convertir une liste en un ensemble: -
Utiliser Stream: Une autre façon est de convertir une liste donnée en flux, puis de diffuser pour définir: -
la source