Cách tốt nhất để chuyển đổi a Map<key,value>thành a là List<value>gì? Chỉ cần lặp lại tất cả các giá trị và chèn chúng vào danh sách hoặc tôi đang xem xét một cái gì đó?
Cách tốt nhất để chuyển đổi a Map<key,value>thành a là List<value>gì? Chỉ cần lặp lại tất cả các giá trị và chèn chúng vào danh sách hoặc tôi đang xem xét một cái gì đó?
Câu trả lời:
List<Value> list = new ArrayList<Value>(map.values());
giả định:
Map<Key,Value> map;
Collectionđể Listcó thể làm việc.
keySet()và values()thường là các đối tượng shim cung cấp giao diện Set hoặc Collection cho cấu trúc bên dưới ( keySet()trả về Set để nhấn mạnh không có bản sao). Đối với values(), đối tượng trả về có thể là một List, nhưng thường sẽ không. Tạo một Danh sách thực, như bạn nói, phá vỡ liên kết có nghĩa là bạn không còn phụ thuộc vào Bản đồ gốc. Tuy nhiên, đôi khi, bạn chỉ cần một Danh sách vì một số API yêu cầu một - củng cố quy tắc rằng một API tốt chỉ nên yêu cầu các giao diện trừu tượng nhất mà nó có thể thoát khỏi ...
Vấn đề ở đây là Mapcó hai giá trị (khóa và giá trị), trong khi Listchỉ có một giá trị (một phần tử).
Do đó, điều tốt nhất có thể được thực hiện là lấy một Listtrong các khóa hoặc các giá trị. (Trừ khi chúng tôi tạo một trình bao bọc để giữ cặp khóa / giá trị).
Nói rằng chúng tôi có một Map:
Map<String, String> m = new HashMap<String, String>();
m.put("Hello", "World");
m.put("Apple", "3.14");
m.put("Another", "Element");
Các khóa như một Listcó thể có được bằng cách tạo một cái mới ArrayListtừ một phương thức được Settrả về Map.keySet:
List<String> list = new ArrayList<String>(m.keySet());
Trong khi các giá trị dưới dạng Listcó thể thu được, tạo một giá trị mới ArrayListtừ phương thức Collectiontrả về Map.values:
List<String> list = new ArrayList<String>(m.values());
Kết quả của việc nhận được các Listphím:
táo Khác xin chào
Kết quả của việc nhận các Listgiá trị:
3.14 Thành phần Thế giới
HashMapcác Maptriển khai không được sắp xếp tương tự, nó sẽ có hiệu quả ngẫu nhiên.
Sử dụng API luồng Java 8.
List<Value> values = map.values().stream().collect(Collectors.toList());
map.entrySet()cung cấp cho bạn một bộ sưu tập các Map.Entryđối tượng chứa cả khóa và giá trị. sau đó bạn có thể chuyển đổi nó thành bất kỳ đối tượng bộ sưu tập nào bạn thích, chẳng hạn như new ArrayList(map.entrySet());
một danh sách những gì?
Giả sử maplà ví dụ của bạn vềMap
map.values()sẽ trả về một Collectionchứa tất cả các giá trị của bản đồ.map.keySet()sẽ trả về một Setchứa tất cả các khóa của bản đồ.Tôi đoán bạn muốn chuyển đổi các giá trị có trong Mapa list? Dễ nhất là gọi values()phương thức của Mapgiao diện. Điều này sẽ trả về các Collectionđối tượng giá trị có trong Map.
Lưu ý rằng điều này Collectionđược hỗ trợ bởi Mapđối tượng và mọi thay đổi Mapđối tượng sẽ phản ánh ở đây. Vì vậy, nếu bạn muốn một bản sao riêng biệt không bị ràng buộc với Mapđối tượng của mình , chỉ cần tạo một Listđối tượng mới giống như ArrayListtruyền giá trị Collectionnhư bên dưới.
ArrayList<String> list = new ArrayList<String>(map.values());
Bạn có thể làm như thế này
List<Value> list = new ArrayList<Value>(map.values());
Nếu bạn muốn đảm bảo các giá trị trong kết quả List<Value>được sắp xếp theo thứ tự khóa của đầu vào Map<Key, Value>, bạn cần phải "đi qua" SortedMapbằng cách nào đó.
Hoặc bắt đầu với một bê tông SortedMapthực hiện (Chẳng hạn như TreeMap) hoặc chèn đầu vào của bạn Mapthành một SortedMaptrước khi chuyển đổi đó để List. ví dụ:
Map<Key,Value> map;
List<Value> list = new ArrayList<Value>( new TreeMap<Key Value>( map ));
Mặt khác, bạn sẽ nhận được bất cứ thứ tự bản địa nào mà việc Maptriển khai cung cấp, thường có thể là thứ gì đó không phải là thứ tự khóa tự nhiên (Hãy thử Hashtablehoặc ConcurrentHashMap, để đa dạng).
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);
chúng ta có thể có cả cặp khóa và giá trị trong danh sách. Cũng có thể nhận khóa và giá trị bằng Map.Entry bằng cách lặp qua danh sách.
// 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());
} "
Đây là phương pháp chung để lấy giá trị từ bản đồ.
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());
}