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?
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 List
s 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 quieressomething.size()
diferentes valores posibles en sus mapas? Es fácil ver que un mapa conk
listas como valores necesita crear al menosk
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
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
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 unnull
lista en este caso.– Andreas Covidiot
24 de septiembre de 2020 a las 11:27
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
- vocación
Collection#toArray()
en el conjunto dado y luego - 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
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
aList
como lo pide el OP. Desafortunadamente, no está claro siCollection
es suficiente o siList
las características son de hecho requeridas.– beatngu13
12 de agosto de 2020 a las 21:09
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