Tại một thời điểm trong mã của tôi, tôi đã tạo một Set<Map.Entry<K, V>>
từ bản đồ. Bây giờ tôi muốn tạo lại cùng một biểu mẫu bản đồ, vì vậy tôi muốn chuyển đổi HashSet<Map.Entry<K, V>>
trở lại thành HashMap<K, V>
. Liệu Java có một cuộc gọi bản địa để làm điều này, hay tôi phải lặp qua các yếu tố thiết lập và xây dựng bản đồ lên bằng tay?Chuyển đổi bộ <Map.Entry <K, V>> thành HashMap <K, V>
Trả lời
Không có API sẵn có trong java để chuyển đổi trực tiếp giữa HashSet
và HashMap
, bạn cần phải lặp qua thiết lập và sử dụng Entry
điền vào bản đồ.
một cách tiếp cận:
Map<Integer, String> map = new HashMap<Integer, String>();
//fill in map
Set<Entry<Integer, String>> set = map.entrySet();
Map<Integer, String> mapFromSet = new HashMap<Integer, String>();
for(Entry<Integer, String> entry : set)
{
mapFromSet.put(entry.getKey(), entry.getValue());
}
Mặc dù là mục đích gì ở đây, nếu bạn làm bất kỳ thay đổi trong Set
rằng cũng sẽ phản ánh trong Map
như thiết lập được trả về bởi Map.entrySet
là sao lưu bởi Map
. Xem javadoc
dưới đây:
Đặt < nhập < Integer, String >> java.util.Map.entrySet()
Trả một cái nhìn Set của ánh xạ chứa trong bản đồ này. Bộ này là được bản đồ sao lưu, vì vậy các thay đổi đối với bản đồ được phản ánh trong bộ này và ngược lại. Nếu bản đồ được sửa đổi trong khi lặp lại trên tập hợp là đang tiến hành (ngoại trừ thông qua thao tác xóa của trình lặp, hoặc thông qua thao tác setValue trên một mục bản đồ được trả về bởi trình lặp ), kết quả của phép lặp không xác định. Bộ này hỗ trợ xóa phần tử , loại bỏ ánh xạ tương ứng khỏi bản đồ, qua Iterator.remove, Set.remove, removeAll, retainAll và xóa hoạt động . Nó không hỗ trợ các hoạt động thêm hoặc addAll.
Giải pháp Java 8 khá ngắn. Có thể đối phó với các phím trùng lặp.
Map<Integer, String> map = new HashMap<>();
//fill in map
Set<Map.Entry<Integer, String>> set = map.entrySet();
Map<Integer, String> mapFromSet = set.stream().collect(Collectors.toMap(Entry::getKey,
Entry::getValue,
(a,b)->b));
Edit: nhờ shmosel người xứng đáng tín dụng nhiều hơn tôi làm cho điều này
No. BiConsumer của bạn không kết hợp Bản đồ. – Joe
Trong đoạn mã trên, phương thức chấp nhận của BiConsumer không bao giờ được gọi. Tôi đã có thể ưa thích sử dụng null nhưng phương pháp thu thập ngớ ngẩn ném một NPE trong trường hợp đó. – mikeyreilly
@mikeyreilly, [tài liệu] (https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#collect-java.util.function.Supplier-java.util .function.BiConsumer-java.util.function.BiConsumer-) không nói rõ ràng rằng bộ kết hợp không bao giờ được gọi là luồng tuần tự. Vì vậy, bạn chỉ vi phạm hợp đồng của phương pháp. –
Trong Java 8 với bộ kết hợp đúng
Map<Integer, String> map = new HashMap<>();
//fill in map
Set<Map.Entry<Integer, String>> set = map.entrySet();
Map<Integer, String> mapFromSet =set.stream().collect(HashMap::new,(t, u) -> t.put(u.getKey(), u.getValue()),
(Map mapToReturn, Map otherMap) ->
{
otherMap.entrySet().forEach((Map.Entry entry) -> {
mapToReturn.put(entry.getKey(),entry.getValue());
});
return mapToReturn;}););
đơn giản-8 Java giải pháp liên quan đến Collectors.toMap
:
Map<Integer, String> mapFromSet = set.stream()
.collect(Collectors.toMap(Entry::getKey, Entry::getValue));
An IllegalStateException
sẽ bị ném nếu d phím gặp phải được gặp phải.
NPE aboug gì nếu giá trị nào là null? –
Tính đến Ổi 19 bạn có thể sử dụng ImmutableMap.copyOf(Iterable<Map.Entry<K,V>>)
Tính đến Java 9, chúng tôi có Map.ofEntries. Họ chỉ lấy các mục như là một mảng mặc dù, vì vậy bạn cần phải chuyển đổi chúng đầu tiên với toArray()
và ném ra các thông tin kiểu.
@SuppressWarnings("unchecked")
(Map.Entry<K, V>[] array = entrySet.toArray((Map.Entry<K, V>[])new Map.Entry<?, ?>[entrySet.size()]);
Map<K, V> map = Map.ofEntries(array);
Apache Commons có các phương pháp tương tự.Commons Lang ArrayUtils.toMap:
Map<Object, Object> map = ArrayUtils.toMap(entrySet.toArray());
// to recover the type...
@SuppressWarnings("unchecked")
Map<K, V> typedMap = (Map<K, V>)(Map<?, ?>)map;
Commons Bộ sưu tập MapUtils.putAll:
Map<K, V> map = MapUtils.putAll(new HashMap<K, V>(), entrySet.toArray());
- 1. Rỗng ILookup <K, T>
- 2. Dump một HashMap Java <K,V> vào XML và quay lại
- 3. Phương pháp mở rộng đơn trên IDictionary <K, IEnumerable/IList/ICollection <V>>
- 4. ArrayList <HashMap <String, String >> để String []
- 5. Không thể chuyển đổi Danh sách <KeyValuePair <...,...>> thành IEnumerable <object>?
- 6. Chuyển đổi thành IEnumerable <dynamic>?
- 7. TextMate js.erb: chuyển đổi <%= %>, <% %>
- 8. chuyển đổi & lt thành <xml document
- 9. Làm thế nào để chuyển đổi một IEnumerable <IEnumerable <T>> thành IEnumerable <T>
- 10. Cách chuyển đổi Expr <'a -> 'b> thành Biểu thức <Func <'a, obj>>
- 11. Làm thế nào để chuyển đổi IQueryable <T> thành Biểu thức <Func <T, bool>>?
- 12. Giá trị chuyển đổi NSMutable <T> thành NS <T>
- 13. Chuyển đổi 'System.Collections.Generic.IEnumerable <T>' thành 'System.Collections.ObjectModel.Collection <T>'
- 14. Chuyển đổi Danh sách <MyObject> thành Từ điển <obj.string, Danh sách <obj.ID>>
- 15. Chuyển đổi một IOrderedEnumerable <KeyValuePair <string, int>> thành một điển <string, int>
- 16. Không thể ngầm chuyển đổi loại 'System.Linq.IQueryable <>' thành 'System.Linq.IOrderedQueryable <>'
- 17. Chuyển đổi từ JsArray <JavaScriptObject> thành Danh sách <JSONObject> trong GWT
- 18. Danh sách <String> cho ArrayList <String> vấn đề chuyển đổi
- 19. Sử dụng <c:forEach> với HashMap
- 20. Không thể chuyển đổi hoàn toàn loại IEnumerable <T> thành IQueryable <T>
- 21. Danh sách chuyển đổi <Integer> thành Danh sách <String>
- 22. Chuyển đổi Danh sách <T> thành một ObservableCollection <T>
- 23. Tại sao thẻ "<br />" của tôi bị chuyển đổi thành "< br/>"?
- 24. Tại sao không shared_ptr <A> chuyển đổi ẩn thành shared_ptr <A const>?
- 25. Chuyển đổi BindingList <MyObject> thành Danh sách <MyObject> C#
- 26. Chuyển đổi Hành động <T> thành Hành động <object>
- 27. chuyển đổi danh sách <int> thành danh sách <long>
- 28. Chuyển đổi Func <T, String> thành Func <T, bool>
- 29. Làm cách nào để chuyển đổi ArrayList <Object> thành ArrayList <String>?
- 30. C# Danh sách chuyển đổi <int> thành Danh sách <double>
Làm thế nào mà bạn đã tạo 'Set' từ 'Map', sử dụng khóa hoặc giá trị hoặc tùy chỉnh logic? bên cạnh đó không có phương thức 'native' cho' HashSet' thành 'HashMap'. Bạn cần phải lặp lại và sử dụng một số logic như trong khi đưa vào 'HashMap' cách bạn chọn khóa và giá trị. – harsh
@Paul nhờ câu hỏi hiện tại có ý nghĩa rõ ràng – harsh
Tôi không nghĩ rằng 'Map.Entry' có nghĩa là được sử dụng theo cách này. Việc thực hiện được sử dụng bởi 'HashMap' ghi đè lên' hashCode' và 'equals' chẳng hạn? –