Каков наилучший способ конвертировать 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());
}