Pregunta La forma más sencilla de convertir una lista en un conjunto en Java


¿Cuál es la forma más fácil de convertir un List a un Set en Java?


505
2017-09-15 22:02


origen


Respuestas:


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

870
2017-09-15 22:05



Estoy de acuerdo con sepp2k, pero hay algunos otros detalles que pueden importar:

new HashSet<Foo>(myList);

le dará un conjunto sin clasificar que no tiene duplicados. En este caso, la duplicación se identifica utilizando el método .equals () en sus objetos. Esto se hace en combinación con el método .hashCode (). (Para más información sobre la igualdad aquí)

Una alternativa que ofrece un conjunto ordenado es:

new TreeSet<Foo>(myList);

Esto funciona si Foo implementa Comparable. Si no es así, puede usar un comparador:

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

Esto depende de compareTo () (de la interfaz comparable) o compare () (del comparador) para garantizar la exclusividad. Entonces, si solo te preocupa la singularidad, utiliza el HashSet. Si buscas una clasificación, considera el TreeSet. (Recuerde: ¡Optimice más tarde!) Si la eficiencia del tiempo es importante, utilice un HashSet si la eficiencia del espacio importa, consulte TreeSet. Tenga en cuenta que las implementaciones más eficientes de Set y Map están disponibles a través de Trove (y otras ubicaciones).


117
2017-09-15 22:29



Si usas el Guayaba biblioteca:

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

o mejor:

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

62
2017-07-20 12:03



Usando java 8 puedes usar 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>);

o ejemplo completo

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



Realizaría una verificación nula antes de convertir a establecer.

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

9
2018-05-13 14:51



Puedes convertir List<> a 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



No olvidemos a nuestro amigo relativamente nuevo,  transmitir API. Si necesita preprocesar la lista antes de convertirla a un conjunto, es mejor tener algo como:

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

5
2018-05-30 10:31



Para Java 8 es muy fácil:

List < UserEntity > vList= new ArrayList<>(); 
vList= service(...);
Set<UserEntity> vSet= vList.stream().collect(Collectors.toSet());

4
2017-11-07 13:16



Hay varias maneras de obtener un Set como:

    List<Integer> sourceList = new ArrayList();
    sourceList.add(1);
    sourceList.add(2);
    sourceList.add(3);
    sourceList.add(4);

    // Using Core Java
    Set<Integer> set1 = new HashSet<>(sourceList);  //needs null-check if sourceList can be null.

    // Java 8
    Set<Integer> set2 = sourceList.stream().collect(Collectors.toSet());
    Set<Integer> set3 = sourceList.stream().collect(Collectors.toCollection(HashSet::new));

    //Guava
    Set<Integer> set4 = Sets.newHashSet(sourceList);

    // Apache commons
    Set<Integer> set5 = new HashSet<>(4);
    CollectionUtils.addAll(set5, sourceList);

Cuando usamos Collectors.toSet() devuelve un conjunto y según el documento:There are no guarantees on the type, mutability, serializability, or thread-safety of the Set returned. Si queremos obtener un HashSet entonces podemos usar la otra alternativa para obtener un conjunto (verificar set3)


2
2017-07-01 12:46



Una solución más resistente de Java 8 con Optional.ofNullable

Set<Foo> mySet = Optional.ofNullable(myList).map(HashSet::new).orElse(null);

2
2018-01-20 16:00