Convertir conjunto en lista sin crear una nueva lista

1 minuto de lectura

avatar de usuario
Muhammad Imran Tarik

Estoy usando este código para convertir un Set a un List:

Map<String, List<String>> mainMap = new HashMap<>();

for (int i=0; i < something.size(); i++) {
  Set<String> set = getSet(...); //returns different result each time
  List<String> listOfNames = new ArrayList<>(set);
  mainMap.put(differentKeyName, listOfNames);
}

Quiero evitar crear una nueva lista en cada iteración del ciclo. ¿Es eso posible?

  • Conozco una forma de convertir un conjunto en una lista como en Q. Quiero evitar crear una nueva lista cada vez que se repite.

    –Muhammad Imran Tariq

    17 de enero de 2012 a las 9:46

  • ¿Por qué no puedes simplemente agregar el conjunto a mainList? ¿Por qué necesita convertir el conjunto en una lista?

    – DagR

    17 de enero de 2012 a las 9:46

  • ¿Es su intención crear una Lista>

    – Hiery Nomus

    17 de enero de 2012 a las 9:48

  • no puedes Su pregunta encarna una contradicción en los términos.

    – usuario207421

    21 de julio de 2016 a las 3:34

avatar de usuario
amit

Puedes usar el Lista.addAll() método. Acepta una Colección como argumento, y su conjunto es una Colección.

List<String> mainList = new ArrayList<String>();
mainList.addAll(set);

EDITAR: como responder a la edición de la pregunta.

Es fácil ver que si quieres tener un Map con Lists como valores, para tener k valores diferentes, necesita crear k listas diferentes.

Por lo tanto: No puede evitar crear estas listas en absoluto, las listas deberán crearse.

Posible solución alternativa:

declara tu Map como un Map<String,Set> o Map<String,Collection> en su lugar, y simplemente inserte su conjunto.

  • lo siento, era mainMap no list. ver pregunta

    –Muhammad Imran Tariq

    17 de enero de 2012 a las 9:51

  • @imrantariq: es differentKeyName cambiando cada iteración? ¿De verdad quieres something.size() diferentes valores posibles en sus mapas? Es fácil ver que un mapa con k listas como valores necesita crear al menos k liza.

    – amit

    17 de enero de 2012 a las 9:55

  • @imrantariq: ¿y quieres una lista diferente para cada clave que supongo?

    – amit

    17/01/2012 a las 10:00

  • @imrantariq: Lo que está solicitando es imposible. lee mi edición para más detalles.

    – amit

    17 de enero de 2012 a las 10:09

  • Devolverá NullPointerException en caso de que el conjunto sea nulo.

    – w35l3y

    30 de agosto de 2016 a las 20:28

avatar de usuario
zengsn

Usa el constructor para convertirlo:

List<?> list = new ArrayList<>(set);

  • Específicamente dijo que quiere evitar esto.

    – mapeadores

    28 de junio de 2016 a las 19:47

  • @mook Irrelevante, ya que su requisito no es implementable.

    – usuario207421

    21 de julio de 2016 a las 3:35

  • @EJP entonces su respuesta debe decir eso, en lugar de simplemente indicar algo que el OP no pidió sin ninguna explicación.

    – mapeadores

    01/08/2016 a las 21:31

  • lo está evitando, ese constructor usa System.arrayCopy, que hace copias superficiales, lo que significa que solo copia las referencias de los objetos en la matriz que se usa para crear la lista. Si compara ambas colecciones, verá que ambas contienen referencias a los mismos objetos.

    – Gubatron

    21 de septiembre de 2016 a las 1:38

  • Esto en realidad no funciona en Android. ¿Por qué?

    – kbluue

    8 de junio de 2017 a las 2:07

avatar de usuario
chaiyachaiya

También de la biblioteca Guava Collect, puede usar newArrayList(Collection):

Lists.newArrayList([your_set])

Esto sería muy similar a la respuesta anterior de amitexcepto que no necesita declarar (o instanciar) ninguna list objeto.

  • Si está usando guayaba, esto es útil

    – vsingh

    16 de julio de 2013 a las 18:28

  • Aunque no está llamando directamente al constructor, este método sigue llamando al ArrayList constructor.

    – glen3b

    17 de mayo de 2014 a las 2:42

  • Si no declaro una Lista, ¿cómo puedo usar la Lista creada?

    – Koray Tugay

    30 de junio de 2014 a las 5:52

  • ¿Alguna conjetura de por qué esto hizo este método? No parece mejor que new ArrayList<>([your_set]).

    – DavidS

    20 de febrero de 2015 a las 22:17

  • @DavidS: los métodos de estilo de fábrica (busque el concepto y las ventajas) son generalmente más flexibles y generales, más fáciles de escribir y manejar. Por ejemplo, imagina que proporcionas un null establecido en una variable y desea obtener un null lista en este caso.

    – Andreas Covidiot

    24 de septiembre de 2020 a las 11:27


avatar de usuario
rajadilipkolli

Podemos usar el siguiente trazador de líneas en Java 8:

List<String> list = set.stream().collect(Collectors.toList());

Aquí hay un pequeño ejemplo:

public static void main(String[] args) {
        Set<String> set = new TreeSet<>();
        set.add("A");
        set.add("B");
        set.add("C");
        List<String> list = set.stream().collect(Collectors.toList());
}

la solución más simple

Quería una forma muy rápida de convertir mi conjunto a Lista y devolverlo, así que en una línea hice

 return new ArrayList<Long>(mySetVariable);

  • Esto también es lo que sugiere IntelliJ IDEA en lugar de la API de flujos.

    – ben

    14 de noviembre de 2018 a las 12:22

Como no se ha mencionado hasta ahora, a partir de Java 10 puede usar el nuevo copyOf método de fábrica:

List.copyOf(set);

Desde el Javadoc:

Devuelve un Lista no modificable que contiene los elementos de la Colección dada, en su orden de iteración.

Tenga en cuenta que esto crea una nueva lista (ImmutableCollections$ListN para ser precisos) bajo el capó por

  1. vocación Collection#toArray() en el conjunto dado y luego
  2. poner estos objetos en una nueva matriz.

  • Esto también es lo que sugiere IntelliJ IDEA en lugar de la API de flujos.

    – ben

    14 de noviembre de 2018 a las 12:22

avatar de usuario
Jerónimo L

Yo lo haría :

Map<String, Collection> mainMap = new HashMap<String, Collection>();

for(int i=0; i<something.size(); i++){
  Set set = getSet(...); //return different result each time
  mainMap.put(differentKeyName,set);
}

  • Buena respuesta porque no requiere una nueva asignación de memoria, como solicitó el OP.

    – cdalxndr

    12 de agosto de 2020 a las 15:30


  • Esto no aborda la conversión de Set a List como lo pide el OP. Desafortunadamente, no está claro si Collection es suficiente o si List las características son de hecho requeridas.

    – beatngu13

    12 de agosto de 2020 a las 21:09


¿Ha sido útil esta solución?