Как преобразовать HashMap в список в Java?

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


person sparkyspider    schedule 30.03.2011    source источник
comment
Вероятно, это не должен быть вопрос - или вы должны превратить его в правильный вопрос и принять первый разумный ответ, который приходит на ум? Это затрудняет поиск реального вопроса, на который нужно ответить.   -  person michel-slm    schedule 30.03.2011
comment
Если требование возврата списка не является обязательным, я думаю, что преобразование Collection или Set в ArrayList не имеет для меня особого смысла. Просто верните коллекцию или набор, который вы получили от HashMap   -  person Nishant    schedule 30.03.2011
comment
продублировано: stackoverflow.com/questions/1026723/   -  person Damian Leszczyński - Vash    schedule 30.03.2011


Ответы (7)


Предполагая, что у вас есть:

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, если вам нужно сохранять взаимно однозначное соответствие позиций ключа и значения в соответствующих списках.

person maerics    schedule 30.03.2011
comment
+1 для отметки правильного порядка следует использовать LinkedHashMap ‹=› List. Кроме того, для неупорядоченных преобразований, вероятно, рекомендуется использовать HashMap ‹=› Set, чтобы указать, что они неупорядочены. - person bcorso; 04.08.2015
comment
Из-за своей простоты это решение кажется лучшим, чем выбранный ответ. - person MAbraham1; 24.11.2015

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

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

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

List<String> valueList = Collections.list(Collections.enumeration(map.values()));
person Damian Leszczyński - Vash    schedule 30.03.2011
comment
Map имеет метод keySet(). Использовать это было бы проще, чем то, что вы опубликовали для keyList. - person Joachim Sauer; 30.03.2011
comment
@Joachim, это правильное название метода, за которое я благодарен. Но если вы хотите преобразовать набор в список, это способ. - person Damian Leszczyński - Vash; 30.03.2011
comment
qVash: почему? вы можете просто использовать new ArrayList(map.keySet()), который является более прямым маршрутом, и не создавать Enumeration. И я почти уверен, что он будет работать лучше, потому что ArrayList будет создан с правильным размером с самого начала. - person Joachim Sauer; 30.03.2011
comment
Вернет ли это ссылку на исходные значения, а не на новый набор объектов? - person sparkyspider; 30.03.2011
comment
@Mark: конечный эффект такой же, как и то, что вы опубликовали: у вас будет новый ArrayList, ссылающийся на тот же объект, на который также ссылается Map. - person Joachim Sauer; 30.03.2011
comment
@Mark, если вы обратитесь к значениям из карты, подойдет, но этот шов решения работает медленнее, чем new ArrayList(Collection<T> col), потому что там таблица сразу копируется в массив с помощью функции Arrays.copy. - person Damian Leszczyński - Vash; 30.03.2011

Интерфейс коллекции имеет 3 просмотра

  • keySet
  • ценности
  • entrySet

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

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

      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 есть этот конструктор.

person VeKe    schedule 09.09.2015

Решение с использованием 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);
    }
person RichardK    schedule 08.03.2016

Если вы хотите, чтобы он проходил только по вашей 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);
}

Конечно, если вы хотите структурно изменить свою карту (то есть больше, чем просто изменить значение существующего ключа) во время итерации, вам лучше использовать метод «копировать в 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);
}
person Paŭlo Ebermann    schedule 30.03.2011

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

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());
}  
person Shengjie    schedule 27.11.2012

person    schedule
comment
По сути, метод .values ​​() класса HashMap возвращает коллекцию значений. Вы также можете использовать .keys () в этом отношении. Класс ArrayList () принимает коллекцию в качестве одного из своих конструкторов. Следовательно, вы создаете новый список ArrayList из коллекции значений HashMap. Понятия не имею, что такое производительность, но для меня простота того стоит! - person sparkyspider; 30.03.2011
comment
если вы просто хотите распечатать или получить объекты - вам не нужно использовать List. - person Nishant; 30.03.2011
comment
Просто добавлю это, чтобы прояснить. - person sparkyspider; 30.03.2011