Estoy usando este código para convertir Set
a a 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 bucle. ¿Es eso posible?
java
performance
list
set
Muhammad Imran Tariq
fuente
fuente
Respuestas:
Puede usar el método List.addAll () . Acepta una Colección como argumento, y su conjunto es una Colección.
EDITAR: como responder a la edición de la pregunta.
Es fácil ver que si desea tener a
Map
conList
s como valores, para tener k valores diferentes, necesita crear k listas diferentes.Por lo tanto: no puede evitar crear estas listas, las listas deberán crearse.
Posible
solución : declare su
Map
como aMap<String,Set>
o en suMap<String,Collection>
lugar, e inserte su conjuntofuente
differentKeyName
cambiando cada iteración? ¿Realmente quieressomething.size()
diferentes valores posibles en tus mapas? Es fácil ver que un mapa conk
listas como valores necesita crear al menosk
listas.Use el constructor para convertirlo:
fuente
También desde la biblioteca Guava Collect, puede usar
newArrayList(Collection)
:Esto sería muy similar a la respuesta anterior de amit , excepto que no necesita declarar (o instanciar) ningún
list
objeto.fuente
ArrayList
constructor.new ArrayList<>([your_set])
.Podemos usar el siguiente trazador de líneas en Java 8:
Aquí hay un pequeño ejemplo:
fuente
Quería una forma muy rápida de convertir mi conjunto a Lista y devolverlo, así que en una línea lo hice
fuente
Puede usar este cambio de una línea:
Arrays.asList(set.toArray(new Object[set.size()]))
fuente
Yo lo haría :
fuente
Como no se ha mencionado hasta ahora, a partir de Java 10 puede usar el nuevo
copyOf
método de fábrica:Del Javadoc :
fuente
Java 8 ofrece la opción de usar transmisiones y puede obtener una lista de la
Set<String> setString
siguiente manera:Aunque la implementación interna a partir de ahora proporciona una instancia de
ArrayList
:pero JDK no lo garantiza. Como se menciona aquí :
En caso de que quiera estar seguro siempre, puede solicitar una instancia específicamente como:
fuente
Creo un
static
método simple :... o si desea establecer el tipo de Lista, puede usar:
fuente
Recientemente encontré esto:
fuente
public static <T> ArrayList<T> list(Enumeration<T> e) { ArrayList<T> l = new ArrayList<>(); while (e.hasMoreElements()) l.add(e.nextElement()); return l; }
En aras de la exhaustividad...
Digamos que usted realmente hacer desea tratar los
Map
valoresList
s, pero se quiere evitar copiar elSet
en unaList
cada vez.Por ejemplo, tal vez estás llamando a una función de biblioteca que crea una
Set
, pero estás pasando tuMap<String, List<String>>
resultado a una función de biblioteca (mal diseñada pero fuera de tu alcance) que solo tomaMap<String, List<String>>
, aunque de alguna manera sabes que las operaciones que realiza conList
s son igualmente aplicables a cualquieraCollection
(y por lo tanto a cualquieraSet
). Y por alguna razón , debe evitar la sobrecarga de velocidad / memoria de copiar cada Conjunto en una Lista.En este caso de súper nicho, dependiendo del comportamiento (tal vez desconocido) que la función de biblioteca necesita de su
List
correo electrónico, puede crear unaList
vista sobre cada Conjunto. Tenga en cuenta que esto es inherentemente inseguro (debido a que los requisitos de la función de biblioteca de cada unoList
podrían presumiblemente cambiar sin que usted lo sepa), por lo que debería preferirse otra solución. Pero así es como lo harías.Crearía una clase que implemente la
List
interfaz, tome unSet
en el constructor y asigne ese conjunto a un campo, y luego use ese internoSet
para implementar laList
API (en la medida de lo posible y deseado).Tenga en cuenta que algunos comportamientos de la Lista que simplemente no podrá imitar sin almacenar los elementos como a
List
, y algunos comportamientos que solo podrá imitar parcialmente. Nuevamente, esta clase no es un reemplazo seguro paraList
s en general. En particular, si sabe que el caso de uso requiere operaciones relacionadas con el índice o MUTAR elList
, este enfoque iría al sur muy rápido.fuente
Encontré esto funcionando bien y útil para crear una Lista a partir de un Conjunto.
fuente
fuente