¿Cuál es la mejor manera de convertir Map<key,value>
a a List<value>
? Simplemente repita todos los valores e insértelos en una lista o ¿estoy pasando por alto algo?
¿Cuál es la mejor manera de convertir Map<key,value>
a a List<value>
? Simplemente repita todos los valores e insértelos en una lista o ¿estoy pasando por alto algo?
Respuestas:
List<Value> list = new ArrayList<Value>(map.values());
asumiendo:
Map<Key,Value> map;
Collection
a List
funcionaría.
keySet()
y values()
generalmente son objetos de ajuste que proporcionan una vista de conjunto o colección de la estructura subyacente ( keySet()
devuelve un conjunto para enfatizar que no hay engaños). Para values()
, el objeto devuelto puede ser un List
, pero a menudo no lo será. La creación de una Lista real, como usted dice, rompe el enlace, lo que significa que ya no depende del Mapa original. A veces sin embargo, sólo se necesita una lista debido a que algunos API requiere uno - el refuerzo de la regla de que una buena API debe requerir sólo las interfaces más abstractas que puede salirse con la suya ...
El problema aquí es que Map
tiene dos valores (una clave y un valor), mientras que un List
solo tiene un valor (un elemento).
Por lo tanto, lo mejor que se puede hacer es obtener una List
de las claves o los valores. (A menos que hagamos un contenedor para mantener el par clave / valor).
Digamos que tenemos un Map
:
Map<String, String> m = new HashMap<String, String>();
m.put("Hello", "World");
m.put("Apple", "3.14");
m.put("Another", "Element");
Las claves como a List
se pueden obtener creando una nueva a ArrayList
partir de una Set
devuelta por el Map.keySet
método:
List<String> list = new ArrayList<String>(m.keySet());
Si bien los valores como a List
se pueden obtener creando uno nuevo a ArrayList
partir de un método Collection
devuelto Map.values
:
List<String> list = new ArrayList<String>(m.values());
El resultado de obtener las List
claves:
manzana Otro Hola
El resultado de obtener los List
valores de:
3.14 Elemento Mundo
HashMap
clasificadas similares Map
será efectivamente aleatorio.
Usando la API de Java 8 Streams.
List<Value> values = map.values().stream().collect(Collectors.toList());
una lista de que?
Asumiendo que map
es tu instancia deMap
map.values()
devolverá un que Collection
contiene todos los valores del mapa.map.keySet()
devolverá un que Set
contenga todas las claves del mapa.Supongo que quieres convertir los valores contenidos en el Map
alist
? Lo más fácil es llamar al values()
método de la Map
interfaz. Esto devolverá los Collection
objetos de valor contenidos en el Map
.
Tenga en cuenta que esto Collection
está respaldado por el Map
objeto y cualquier cambio en el Map
objeto se reflejará aquí. Entonces, si desea una copia separada no vinculada a su Map
objeto, simplemente cree un nuevo List
objeto como ArrayList
pasar el valor Collection
como se muestra a continuación.
ArrayList<String> list = new ArrayList<String>(map.values());
Puedes hacerlo así
List<Value> list = new ArrayList<Value>(map.values());
Si desea asegurarse de que los valores en la resultante List<Value>
están en el orden de las claves de la entrada Map<Key, Value>
, debe "ir a través de" de SortedMap
alguna manera.
O bien comenzar con una concreta SortedMap
aplicación (tal como TreeMap
) o inserte su entrada Map
en una SortedMap
antes de la conversión que a List
. p.ej:
Map<Key,Value> map;
List<Value> list = new ArrayList<Value>( new TreeMap<Key Value>( map ));
De lo contrario, obtendrá el orden nativo que Map
proporciona la implementación, que a menudo puede ser algo diferente al orden de las teclas naturales (Pruebe Hashtable
o ConcurrentHashMap
, para variar).
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("java", 20);
map.put("C++", 45);
Set <Entry<String, Integer>> set = map.entrySet();
List<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>>(set);
podemos tener pares de clave y valor en la lista. También podemos obtener clave y valor usando Map.Entry iterando sobre la lista.
// you can use this
List<Value> list = new ArrayList<Value>(map.values());
// or you may use
List<Value> list = new ArrayList<Value>();
for (Map.Entry<String, String> entry : map.entrySet())
{
list.add(entry.getValue());
}
"Map<String , String > map = new HapshMap<String , String>;
map.add("one","java");
map.add("two" ,"spring");
Set<Entry<String,String>> set = map.entrySet();
List<Entry<String , String>> list = new ArrayList<Entry<String , String>> (set);
for(Entry<String , String> entry : list ) {
System.out.println(entry.getKey());
System.out.println(entry.getValue());
} "
Aquí está el método genérico para obtener valores del mapa.
public static <T> List<T> ValueListFromMap(HashMap<String, T> map) {
List<T> thingList = new ArrayList<>();
for (Map.Entry<String, T> entry : map.entrySet()) {
thingList.add(entry.getValue());
}
return thingList;
}
HashMap<Integer, List<String>> map = new HashMap<>();
List<String> list = new ArrayList<String>();
list.add("Java");
list.add("Primefaces");
list.add("JSF");
map.put(1,list);
if(map != null){
return new ArrayList<String>((Collection<? extends String>) map.values());
}