Каков наилучший способ конвертировать Map<key,value>
в List<value>
? Просто переберите все значения и вставьте их в список или я что-то пропускаю?
Каков наилучший способ конвертировать Map<key,value>
в List<value>
? Просто переберите все значения и вставьте их в список или я что-то пропускаю?
Ответы:
List<Value> list = new ArrayList<Value>(map.values());
при условии:
Map<Key,Value> map;
Collection
к List
будет работать.
keySet()
и, values()
как правило, являются объектами-оболочками, которые дают представление Set или Collection базовой структуры ( keySet()
возвращает Set, чтобы подчеркнуть отсутствие дубликатов). Ибо values()
возвращаемый объект может быть List
, но часто не будет. Создание настоящего Списка, как вы говорите, нарушает ссылку, что означает, что вы больше не зависите от исходной Карты. Иногда, однако, вам нужен только List, потому что некоторые API требуют одного - усиливая правило, что хороший API должен требовать только самых абстрактных интерфейсов, с
Проблема здесь в том, что у Map
него есть два значения (ключ и значение), в то время как a 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
ключей:
яблоко Другая Привет
Результат получения List
значений:
3,14 Элемент Мир
HashMap
аналогичных несортированных Map
реализаций он будет фактически случайным.
Использование Java 8 Streams API.
List<Value> values = map.values().stream().collect(Collectors.toList());
список чего?
Предположим, map
это ваш примерMap
map.values()
вернет Collection
содержащий все значения карты.map.keySet()
вернет Set
содержащий все ключи карты.Я предполагаю , что вы хотите , чтобы преобразовать значения , содержащиеся в Map
к list
? Проще всего вызвать values()
метод Map
интерфейса. Это вернет Collection
объекты значения, содержащиеся в Map
.
Обратите внимание, что это Collection
поддерживается Map
объектом, и любые изменения в Map
объекте будут отражены здесь. Поэтому, если вы хотите, чтобы отдельная копия не была привязана к вашему Map
объекту, просто создайте новый List
объект, например, ArrayList
передав значение, Collection
как показано ниже.
ArrayList<String> list = new ArrayList<String>(map.values());
Вы можете сделать это так
List<Value> list = new ArrayList<Value>(map.values());
Если вы хотите убедиться, что значения в результате 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
обеспечивает реализация в собственном порядке , что часто может быть чем-то отличным от упорядочения естественного ключа (Try Hashtable
или ConcurrentHashMap
, для разнообразия).
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, перебирая список.
// 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());
}
"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());
} "
Вот общий метод для получения значений из карты.
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;
}
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());
}