Как в Java получить значения HashMap
, возвращенные как List
?
Как преобразовать HashMap в список в Java?
Ответы (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, если вам нужно сохранять взаимно однозначное соответствие позиций ключа и значения в соответствующих списках.
LinkedHashMap
‹=› List
. Кроме того, для неупорядоченных преобразований, вероятно, рекомендуется использовать HashMap
‹=› Set
, чтобы указать, что они неупорядочены.
- person bcorso; 04.08.2015
По сути, вы не должны путать вопрос с ответом, потому что это сбивает с толку.
Затем вы можете указать, что означает преобразование, и выбрать одно из этих решений
List<Integer> keyList = Collections.list(Collections.enumeration(map.keySet()));
List<String> valueList = Collections.list(Collections.enumeration(map.values()));
Map
имеет метод keySet()
. Использовать это было бы проще, чем то, что вы опубликовали для keyList
.
- person Joachim Sauer; 30.03.2011
new ArrayList(map.keySet())
, который является более прямым маршрутом, и не создавать Enumeration
. И я почти уверен, что он будет работать лучше, потому что ArrayList
будет создан с правильным размером с самого начала.
- person Joachim Sauer; 30.03.2011
ArrayList
, ссылающийся на тот же объект, на который также ссылается Map
.
- person Joachim Sauer; 30.03.2011
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 есть этот конструктор.
Решение с использованием 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);
}
Если вы хотите, чтобы он проходил только по вашей 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);
}
Если вы хотите сохранить тот же порядок в своем списке, скажите: ваша карта выглядит так:
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());
}
Collection
илиSet
вArrayList
не имеет для меня особого смысла. Просто верните коллекцию или набор, который вы получили от HashMap - person Nishant   schedule 30.03.2011