Який найкращий спосіб перетворити 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());
}