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;
Collectionpara Listiria 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 Mappossui dois valores (uma chave e um valor), enquanto um Listpossui apenas um valor (um elemento).
Portanto, o melhor que pode ser feito é obter uma Listdas 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 Listpodem ser obtidas criando um novo ArrayListde um Setretornado pelo Map.keySetmétodo:
List<String> list = new ArrayList<String>(m.keySet());
Enquanto os valores como a Listpodem ser obtidos, crie um novo ArrayListde um Collectionretornado pelo Map.valuesmétodo:
List<String> list = new ArrayList<String>(m.values());
O resultado de obter as Listchaves:
maçã Outro Olá
O resultado da obtenção Listdos valores:
3,14 Elemento Mundo
HashMapclassificadas 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.Entryobjetos 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 mapseja sua instância deMap
map.values()retornará um Collectioncontendo todos os valores do mapa.map.keySet()retornará um Setcontendo todas as chaves do mapa.Eu acho que você deseja converter os valores contidos no Mappara a list? O mais fácil é chamar o values()método da Mapinterface. Isso retornará os Collectionobjetos de valor contidos no Map.
Observe que isso Collectioné apoiado pelo Mapobjeto e quaisquer alterações no Mapobjeto serão refletidas aqui. Portanto, se você deseja que uma cópia separada não esteja vinculada ao seu Mapobjeto, basta criar um novo Listobjeto, como ArrayListpassar o valor Collectionabaixo.
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 SortedMapde implementação (tais como TreeMap) ou inserir sua entrada Mapem um SortedMapantes 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 Mapfornecida 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());
}