Qual é a melhor maneira de converter um Map<key,value>
para um List<value>
? Basta iterar sobre todos os valores e inseri-los em uma lista ou estou ignorando alguma coisa?
Qual é a melhor maneira de converter um Map<key,value>
para um List<value>
? Basta iterar sobre todos os valores e inseri-los em uma lista ou estou ignorando alguma coisa?
Respostas:
List<Value> list = new ArrayList<Value>(map.values());
assumindo:
Map<Key,Value> map;
Collection
para List
iria funcionar.
keySet()
e values()
geralmente são objetos de calço que fornecem uma visualização de conjunto ou coleção da estrutura subjacente ( keySet()
retorna um conjunto para enfatizar não enganos). Pois values()
, o objeto retornado pode ser um List
, mas geralmente não será. Criar uma lista real, como você diz, quebra o link, o que significa que você não depende mais do mapa original. Às vezes, porém, você só precisa de uma lista, porque alguns API requer um - reforçando a regra de que uma boa API deve exigir apenas as interfaces mais abstratos que podem fugir com ...
O problema aqui é que Map
possui dois valores (uma chave e um valor), enquanto um List
possui apenas um valor (um elemento).
Portanto, o melhor que pode ser feito é obter uma List
das chaves ou os valores. (A menos que façamos um invólucro para manter o par de chave / valor).
Digamos 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 a List
podem ser obtidas criando um novo ArrayList
de um Set
retornado pelo Map.keySet
método:
List<String> list = new ArrayList<String>(m.keySet());
Enquanto os valores como a List
podem ser obtidos, crie um novo ArrayList
de um Collection
retornado pelo Map.values
método:
List<String> list = new ArrayList<String>(m.values());
O resultado de obter as List
chaves:
maçã Outro Olá
O resultado da obtenção List
dos valores:
3,14 Elemento Mundo
HashMap
classificadas semelhantes Map
, será efetivamente aleatória.
Usando a API Java 8 Streams.
List<Value> values = map.values().stream().collect(Collectors.toList());
map.entrySet()
fornece uma coleção de Map.Entry
objetos contendo chave e valor. você pode transformar isso em qualquer objeto de coleção que desejar, como new ArrayList(map.entrySet())
;
uma lista do que?
Supondo que map
seja sua instância deMap
map.values()
retornará um Collection
contendo todos os valores do mapa.map.keySet()
retornará um Set
contendo todas as chaves do mapa.Eu acho que você deseja converter os valores contidos no Map
para a list
? O mais fácil é chamar o values()
método da Map
interface. Isso retornará os Collection
objetos de valor contidos no Map
.
Observe que isso Collection
é apoiado pelo Map
objeto e quaisquer alterações no Map
objeto serão refletidas aqui. Portanto, se você deseja que uma cópia separada não esteja vinculada ao seu Map
objeto, basta criar um novo List
objeto, como ArrayList
passar o valor Collection
abaixo.
ArrayList<String> list = new ArrayList<String>(map.values());
Você pode fazer assim
List<Value> list = new ArrayList<Value>(map.values());
Se você deseja garantir que os valores no resultante List<Value>
estejam na ordem das chaves da entrada Map<Key, Value>
, é necessário "continuar"SortedMap
alguma forma.
Ou começar com um concreto SortedMap
de implementação (tais como TreeMap
) ou inserir sua entrada Map
em um SortedMap
antes de converter isso para List
. por exemplo:
Map<Key,Value> map;
List<Value> list = new ArrayList<Value>( new TreeMap<Key Value>( map ));
Caso contrário, você receberá qualquer ordem nativa Map
fornecida pela implementação, que geralmente pode ser algo diferente da ordem da chave natural (tenteHashtable
ou 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 ter o par de chave e valor na lista. Também podemos obter chave e valor usando Map.Entry iterando a 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 do 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());
}