Який найкращий спосіб перетворити Map<key,value>на a List<value>? Просто перегляньте всі значення та вставте їх у список чи я щось пропускаю?
Який найкращий спосіб перетворити Map<key,value>на a List<value>? Просто перегляньте всі значення та вставте їх у список чи я щось пропускаю?
Відповіді:
List<Value> list = new ArrayList<Value>(map.values());
припускаючи:
Map<Key,Value> map;
Collectionдо Listпрацюватиме.
keySet()і, values()як правило, переливаються об'єктами, які надають вигляд Set або Collection базової структури ( keySet()повертає Set без наголосу). Бо values()повернутий об'єкт може бути List, але часто не буде. Як ви говорите, створення справжнього списку розриває посилання, що означає, що ви більше не залежите від оригінальної карти. Хоча іноді вам потрібен лише список, оскільки для деяких API потрібен такий - посилення правила, що для хорошого API потрібно вимагати лише найабстрактніші інтерфейси, з якими він може вийти ...
Проблема тут полягає в тому, що Mapвона має два значення (ключ і значення), а 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());
Хоча значення як a Listможна отримати, створюючи нове ArrayListз Collectionповернутого Map.valuesметодом:
List<String> list = new ArrayList<String>(m.values());
Результат отримання Listключів:
Apple Ще одна Здравствуйте
Результат отримання Listзначень:
3.14 Стихія Світ
HashMapта подібних несортізованих Mapреалізацій він буде фактично випадковим.
Використання API Java 8 Streams.
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, яке забезпечує реалізація, що часто може бути чимось іншим, ніж звичайне замовлення ключів (Спробуйте 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());
}