Як перетворити карту в список на Java?


674

Який найкращий спосіб перетворити Map<key,value>на a List<value>? Просто перегляньте всі значення та вставте їх у список чи я щось пропускаю?


1
Я думаю, що це не дуже вдала модель, якщо треба перетворити карту в список. Код слід написати таким чином, щоб ця ситуація не виникала.
Помилки трапляються

Відповіді:


1299
List<Value> list = new ArrayList<Value>(map.values());

припускаючи:

Map<Key,Value> map;

7
Дякую! Я припускав , кидання від Collectionдо Listпрацюватиме.
asgs

1
Я підозрюю, що причина не працює в тому, що колекція, повернена значеннями (), залежить від основної карти; роблячи натомість виклик конструктора копій, ви виділяєте сховище та копіюєте значення в цей сховище, тим самим розриваючи з'єднання ...
Шелдон Р.

4
Якщо у нас є LinkedHashMap - чи буде замовлення таким же?

1
@ user2022068 так, замовлення слід зберігати за допомогою LinkedHashMap.
SusanW

1
@SheldonR. так - колекції, що повертаються, keySet()і, values()як правило, переливаються об'єктами, які надають вигляд Set або Collection базової структури ( keySet()повертає Set без наголосу). Бо values()повернутий об'єкт може бути List, але часто не буде. Як ви говорите, створення справжнього списку розриває посилання, що означає, що ви більше не залежите від оригінальної карти. Хоча іноді вам потрібен лише список, оскільки для деяких API потрібен такий - посилення правила, що для хорошого API потрібно вимагати лише найабстрактніші інтерфейси, з якими він може вийти ...
SusanW

137

Проблема тут полягає в тому, що 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());

Хоча значення як a Listможна отримати, створюючи нове ArrayListз Collectionповернутого Map.valuesметодом:

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

Результат отримання Listключів:

Apple
Ще одна
Здравствуйте

Результат отримання Listзначень:

3.14
Стихія
Світ

3
Слід зазначити, що порядок значень, що повертаються цими методами, не визначений, і для HashMapта подібних несортізованих Mapреалізацій він буде фактично випадковим.
Йоахім Зауер

1
Так, ви повинні знати, що це LinkedHashMap або щось подібне. Проблема з оригінальним питанням полягає в тому, що це питання неправильно, тобто воно потребує редагування. Питання полягає не в перетворенні карти в список, а в тому, як отримати значення карти у вигляді списку. Значення методу дає збірник, але не перелік, а отже, і необхідність у акуратному маленькому фокусі.
demongolem

Я думаю, ви можете додати до своєї відповіді те, що говорить @ M0les: Що вам потрібно якось "пройти" SortedMap. Почніть з конкретної реалізації SortedMap (наприклад, TreeMap) або вставте свою вхідну карту в SortedMap, перш ніж перетворити її в Список
Ігнасіо Рубіо

41

Використання API Java 8 Streams.

List<Value> values = map.values().stream().collect(Collectors.toList());

8
Я вважаю за краще прийняту, засновану на конструкторі відповідь. Потоки повинні бути для спрощення коду.
Аарон

1
@Aaron Так, для завдання отримання списку значень з Map конструктор здається більш простим. Однак якщо ви використовуєте Streams екстенсивно в кодовій базі, краще залишатися послідовними.
Матей Кормут

1
коли я використовую це, отримую помилку, якщо я отримую величезну кількість даних .. Thread лунає на java.util.stream.ReduceOps $ 3.makeSink (Невідоме джерело). Якщо потоки циклу нескінченно, споживання процесора почне наростати.
Ганеш Гірі,

24

map.entrySet()дає вам колекцію Map.Entryоб'єктів, що містять як ключові, так і значення. потім ви можете перетворити це в будь-який об’єкт колекції, який вам подобається, наприклад new ArrayList(map.entrySet());


23

список чого?

Припустимо, mapце ваш примірникMap

  • map.values()поверне Collectionвміст усіх значень карти.
  • map.keySet()повернеться, що Setмістить усі ключі карти.

14

Я думаю, ви хочете перетворити значення, що містяться в а, Mapв list? Найпростіше викликати values()метод Mapінтерфейсу. Це поверне Collectionзначення об'єктів цінності, що містяться в Map.

Зауважте, що це Collectionпідкріплено Mapоб'єктом, і будь-які зміни Mapоб’єкта відображатимуться тут. Тож якщо ви хочете, щоб окрема копія не була прив’язана до вашого Mapоб’єкта, просто створіть новий Listоб’єкт, як ArrayListпередаючи значення, як показано Collectionнижче.

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

6

Ви можете це зробити так

List<Value> list = new ArrayList<Value>(map.values());

1
ОП запитайте про те, як перетворити у Список <значення>. Коли ви дасте відповіді, краще включити Хороший опис із запропонованим рішенням. На це питання вже прийнято відповідь.
HaveNoDisplayName

5

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

Або почати з конкретної SortedMapреалізацією (наприклад, TreeMap) або вставити введення Mapв SortedMapдо перетворення , що List. наприклад:

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

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


5
    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, повторивши список.


4
// 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());    
}

1
"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());
 } "

1

Ось загальний метод отримання значень з карти.

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;
}

1
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());
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.