Как преобразовать HashMap в список в Java? - PullRequest
50 голосов
/ 30 марта 2011

В Java, как получить значения HashMap, возвращаемые как List?

Ответы [ 7 ]

87 голосов
/ 30 марта 2011
HashMap<Integer, String> map = new HashMap<Integer, String>();
map.put (1, "Mark");
map.put (2, "Tarryn");
List<String> list = new ArrayList<String>(map.values());
for (String s : list) {
    System.out.println(s);
}
69 голосов
/ 30 марта 2011

Если у вас есть:

HashMap<Key, Value> map; // Assigned or populated somehow.

Для списка значений:

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

Для списка ключей:

List<Key> keys = new ArrayList<Key>(map.keySet());

Обратите внимание, что порядок ключей и значений будет ненадежным с HashMap; используйте LinkedHashMap , если вам нужно сохранить однозначное соответствие позиций ключа и значения в их соответствующих списках.

7 голосов
/ 30 марта 2011

По сути, вы не должны связывать вопрос с ответом, потому что это сбивает с толку.

Затем вы можете указать, что означает преобразование, и выбрать одно из этих решений

List<Integer> keyList = Collections.list(Collections.enumeration(map.keySet()));

List<String> valueList = Collections.list(Collections.enumeration(map.values()));
5 голосов
/ 09 сентября 2015

Интерфейс сбора имеет 3 вида

  • набор ключей
  • значения
  • entrySet

Другие ответили, чтобы преобразовать Hashmap в два списка ключа и значения.Это совершенно правильно

Мое добавление: Как преобразовать "пару ключ-значение" (он же entrySet) в список.

      Map m=new HashMap();
          m.put(3, "dev2");
          m.put(4, "dev3");

      List<Entry> entryList = new ArrayList<Entry>(m.entrySet());

      for (Entry s : entryList) {
        System.out.println(s);
      }

ArrayList имеет этот конструктор.

4 голосов
/ 08 марта 2016

Решение с использованием Java 8 и Stream Api:

private static <K, V>  List<V> createListFromMapEntries (Map<K, V> map){
        return map.values().stream().collect(Collectors.toList());
    }

Использование:

  public static void main (String[] args)
    {
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "one");
        map.put(2, "two");
        map.put(3, "three");

        List<String> result = createListFromMapEntries(map);
        result.forEach(System.out :: println);
    }
1 голос
/ 27 ноября 2012

Если вы хотите сохранить тот же порядок в вашем списке, скажите: ваша карта выглядит следующим образом:

map.put(1, "msg1")
map.put(2, "msg2")
map.put(3, "msg3")

и вы хотите, чтобы ваш список выглядел как

["msg1", "msg2", "msg3"]   // same order as the map

, вам придетсяитерация по карте:

// sort your map based on key, otherwise you will get IndexOutofBoundException
Map<String, String> treeMap = new TreeMap<String, String>(map)

List<String> list = new List<String>();
for (treeMap.Entry<Integer, String> entry : treeMap.entrySet()) {
    list.add(entry.getKey(), entry.getValue());
}  
1 голос
/ 30 марта 2011

Если вы хотите, чтобы он только перебирал вашу HashMap, вам не нужен список:

HashMap<Integer, String> map = new HashMap<Integer, String>();
map.put (1, "Mark");
map.put (2, "Tarryn");
for (String s : map.values()) {
    System.out.println(s);
}

Конечно, если вы хотите изменить свою карту структурно (т.е. больше, чем просто изменить значение длясуществующего ключа) при итерации лучше использовать метод «copy to ArrayList», так как в противном случае вы получите исключение ConcurrentModificationException.Или экспортировать как массив:

HashMap<Integer, String> map = new HashMap<Integer, String>();
map.put (1, "Mark");
map.put (2, "Tarryn");
for (String s : map.values().toArray(new String[]{})) {
    System.out.println(s);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...