Как преобразовать карту в список в Java? - PullRequest
625 голосов
/ 22 июня 2009

Как лучше всего преобразовать Map<key,value> в List<value>? Просто переберите все значения и вставьте их в список или я что-то пропустил?

Ответы [ 13 ]

1227 голосов
/ 22 июня 2009
List<Value> list = new ArrayList<Value>(map.values());

при условии:

Map<Key,Value> map;
129 голосов
/ 22 июня 2009

Проблема здесь в том, что Map имеет два значения (ключ и значение), в то время как List имеет только одно значение (элемент).

Следовательно, лучшее, что можно сделать, - это получить List ключей или значений. (Если только мы не создадим оболочку для пары ключ / значение).

Скажем, у нас есть Map:

Map<String, String> m = new HashMap<String, String>();
m.put("Hello", "World");
m.put("Apple", "3.14");
m.put("Another", "Element");

Ключи как List можно получить, создав новый ArrayList из Set, возвращенного методом Map.keySet :

List<String> list = new ArrayList<String>(m.keySet());

В то время как значения List могут быть получены путем создания нового ArrayList из Collection, возвращенного методом Map.values:

List<String> list = new ArrayList<String>(m.values());

Результат получения List ключей:

Apple
Another
Hello

Результат получения List значений:

3.14
Element
World
31 голосов
/ 19 сентября 2015

Использование API Java 8 Streams.

List<Value> values = map.values().stream().collect(Collectors.toList());
22 голосов
/ 16 ноября 2010

map.entrySet() дает вам коллекцию Map.Entry объектов, содержащих ключ и значение. затем вы можете преобразовать его в любой объект коллекции, например, new ArrayList(map.entrySet());

21 голосов
/ 22 июня 2009

список чего?

Предполагая, что map является вашим экземпляром Map

  • map.values() вернет Collection, содержащее все значения карты.
  • map.keySet() вернет Set, содержащий все ключи карты.
12 голосов
/ 22 июня 2009

Полагаю, вы хотите преобразовать значения, содержащиеся в Map, в list? Проще всего вызвать метод values() интерфейса Map. Это вернет Collection объектов значений, содержащихся в Map.

Обратите внимание, что этот Collection поддерживается объектом Map, и любые изменения в объекте Map будут отражены здесь. Поэтому, если вы хотите, чтобы отдельная копия не была связана с вашим Map объектом, просто создайте новый List объект, такой как ArrayList, передав значение Collection, как показано ниже.

ArrayList<String> list = new ArrayList<String>(map.values());
6 голосов
/ 23 ноября 2014

Вы можете сделать это так

List<Value> list = new ArrayList<Value>(map.values());
4 голосов
/ 18 марта 2014

Если вы хотите убедиться, что значения в результирующем List<Value> находятся в порядке клавиш ввода Map<Key, Value>, вам нужно как-то "пройти через" SortedMap.

Либо запустите с конкретной реализацией SortedMap (например, TreeMap), либо вставьте ввод Map в SortedMap перед преобразованием этого в List. e.g.:

Map<Key,Value> map;
List<Value> list = new ArrayList<Value>( new TreeMap<Key Value>( map ));

В противном случае вы получите тот собственный порядок, который обеспечивает реализация Map, который часто может отличаться от порядка естественного ключа (попробуйте Hashtable или ConcurrentHashMap, для разнообразия).

3 голосов
/ 17 июля 2014
    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);

у нас может быть пара ключей и значений в списке. Также можно получить ключ и значение с помощью Map.Entry, перебирая список.

2 голосов
/ 29 марта 2018
// 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());    
}
...