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?

Foi útil?

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á 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 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());
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top