Como converter um mapa para lista em Java?
-
06-07-2019 - |
Pergunta
O que é a melhor maneira de converter um Map<key,value>
a um List<value>
? Apenas iterar sobre todos os valores e inseri-los em uma lista ou estou esquecendo algo?
Solução
List<Value> list = new ArrayList<Value>(map.values());
assumindo:
Map<Key,Value> map;
Outras dicas
A questão aqui é que Map
tem dois valores (uma chave e de valor), enquanto uma List
tem apenas um valor (um elemento).
Portanto, o melhor que pode ser feito é fazer com que seja um List
das chaves ou os valores. (A menos que façamos um wrapper para segurar a / par de chaves valor).
dizer que temos um Map
:
Map<String, String> m = new HashMap<String, String>();
m.put("Hello", "World");
m.put("Apple", "3.14");
m.put("Another", "Element");
As chaves como List
pode ser obtido através da criação de um novo ArrayList
de um Set
devolvido pelo Map.keySet
método:
List<String> list = new ArrayList<String>(m.keySet());
Enquanto os valores como um List
pode ser obtido criando um novo ArrayList
de um Collection
devolvido pelo Map.values
método:
List<String> list = new ArrayList<String>(m.values());
O resultado de obter o List
de chaves:
Apple Another Hello
O resultado de obter o List
de valores:
3.14 Element World
Usando a API Java 8 Streams.
List<Value> values = map.values().stream().collect(Collectors.toList());
map.entrySet()
dá-lhe uma coleção de objetos Map.Entry
contendo tanto chave e valor. então você pode transformar isso em qualquer objeto coleção que você gosta, como new ArrayList(map.entrySet())
;
uma lista do que?
Assumindo map
é a instância do Map
-
map.values()
retornará umCollection
contendo todos os valores do mapa. -
map.keySet()
retornará umSet
contendo todas as chaves do mapa.
Eu acho que você deseja converter os valores contidos no Map
a um list
? Mais fácil é chamar o método values()
da interface Map
. Isto irá devolver o Collection
de valor objetos contidos no Map
.
Note que este Collection
é apoiado pelo objeto Map
e quaisquer alterações para o objeto Map
refletirá aqui. Então, se você quiser uma cópia em separado que não esteja vinculada ao seu objeto Map
, basta criar um novo objeto List
como um ArrayList
passando o valor Collection
como abaixo.
ArrayList<String> list = new ArrayList<String>(map.values());
Você pode fazê-lo como este
List<Value> list = new ArrayList<Value>(map.values());
Se você quiser garantir os valores no List<Value>
resultante estão na chave-ordenação do Map<Key, Value>
de entrada, você precisa "passar por" SortedMap
de alguma forma.
De qualquer start com uma implementação concreta SortedMap
(Tais como TreeMap
) ou inserir o Map
entrada em um SortedMap
antes de converter que a List
. por exemplo:.
Map<Key,Value> map;
List<Value> list = new ArrayList<Value>( new TreeMap<Key Value>( map ));
Caso contrário, você vai conseguir tudo o ordenamento nativa a implementação Map
fornece, que muitas vezes pode ser algo diferente do que a ordenação chave natural (Tente Hashtable
ou ConcurrentHashMap
, para a variedade).
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 ter tanto par de chaves e valor em list.Also pode obter chave e valor usando Map.Entry por iteração sobre 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());
} "
Aqui está o método genérico para obter valores de 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());
}