Question Méthode la plus simple pour convertir une liste en ensemble en Java


Quel est le moyen le plus simple de convertir un List à un Set en Java?


505
2017-09-15 22:02


origine


Réponses:


Set<Foo> foo = new HashSet<Foo>(myList);

870
2017-09-15 22:05



Je suis d'accord avec sepp2k, mais il y a d'autres détails qui pourraient avoir de l'importance:

new HashSet<Foo>(myList);

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. Ceci est 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:

new TreeSet<Foo>(myList);

Cela fonctionne si Foo implémente Comparable. Si ce n'est pas le cas, vous pouvez utiliser un comparateur:

Set<Foo> lSet = new TreeSet<Foo>(someComparator);
lSet.addAll(myList);

Cela dépend soit de compareTo () (de l'interface comparable) soit de compare () (du comparateur) pour assurer l'unicité. Donc, si vous vous souciez seulement de l'unicité, utilisez le HashSet. Si vous êtes après le tri, considérez le TreeSet. (Rappelez-vous: Optimisez plus tard!) Si l'efficacité du temps est importante, 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).


117
2017-09-15 22:29



Si vous utilisez le Goyave bibliothèque:

Set<Foo> set = Sets.newHashSet(list);

ou mieux:

Set<Foo> set = ImmutableSet.copyOf(list);

62
2017-07-20 12:03



En utilisant java 8 vous pouvez utiliser stream:

List<Integer> mylist = Arrays.asList(100, 101, 102);
Set<Integer> myset = mylist.stream().collect(Collectors.toSet()));

17
2018-04-13 15:53



Set<E> alphaSet  = new HashSet<E>(<your List>);

ou exemple complet

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class ListToSet
{
    public static void main(String[] args)
    {
        List<String> alphaList = new ArrayList<String>();
        alphaList.add("A");
        alphaList.add("B");
        alphaList.add("C");
        alphaList.add("A");
        alphaList.add("B");
        System.out.println("List values .....");
        for (String alpha : alphaList)
        {
            System.out.println(alpha);
        }
        Set<String> alphaSet = new HashSet<String>(alphaList);
        System.out.println("\nSet values .....");
        for (String alpha : alphaSet)
        {
            System.out.println(alpha);
        }
    }
}

14
2018-04-19 15:40



J'effectuerais une vérification Null avant de convertir en set.

if(myList != null){
Set<Foo> foo = new HashSet<Foo>(myList);
}

9
2018-05-13 14:51



Vous pouvez convertir List<> à Set<>

Set<T> set=new HashSet<T>();

//Added dependency -> If list is null then it will throw NullPointerExcetion.

Set<T> set;
if(list != null){
    set = new HashSet<T>(list);
}

5
2017-12-19 03:03



N'oublions pas notre ami relativement nouveau,  API de flux. Si vous devez prétraiter la liste avant de la convertir en ensemble, il vaut mieux avoir quelque chose comme:

list.stream().<here goes some preprocessing>.collect(Collectors.toSet());

5
2018-05-30 10:31