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
để List
có 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à Map
có hai giá trị (khóa và giá trị), trong khi List
chỉ 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 List
trong 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 List
có thể có được bằng cách tạo một cái mới ArrayList
từ một phương thức được Set
trả về Map.keySet
:
List<String> list = new ArrayList<String>(m.keySet());
Trong khi các giá trị dưới dạng List
có thể thu được, tạo một giá trị mới ArrayList
từ phương thức Collection
trả về Map.values
:
List<String> list = new ArrayList<String>(m.values());
Kết quả của việc nhận được các List
phím:
táo Khác xin chào
Kết quả của việc nhận các List
giá trị:
3.14 Thành phần Thế giới
HashMap
các Map
triể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ử map
là ví dụ của bạn vềMap
map.values()
sẽ trả về một Collection
chứa tất cả các giá trị của bản đồ.map.keySet()
sẽ trả về một Set
chứ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 Map
a list
? Dễ nhất là gọi values()
phương thức của Map
giao 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ư ArrayList
truyền giá trị Collection
như 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" SortedMap
bằng cách nào đó.
Hoặc bắt đầu với một bê tông SortedMap
thực hiện (Chẳng hạn như TreeMap
) hoặc chèn đầu vào của bạn Map
thành một SortedMap
trướ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 Map
triể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ử Hashtable
hoặ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());
}