Tôi đang cố hợp nhất hai Bản đồ nhưng không có phương thức tích hợp để tham gia Bộ sưu tập. vậy bạn sẽ làm sao?trong F #, Làm cách nào để hợp nhất 2 trường hợp Collections.Map?
Trả lời
Xác định các chức năng sau:
let join (p:Map<'a,'b>) (q:Map<'a,'b>) =
Map(Seq.concat [ (Map.toSeq p) ; (Map.toSeq q) ])
dụ:
let a = Map([1,11;2,21;3,31;])
let b = Map([3,32; 4,41;5,51;6,61;])
let c = join a b
và kết quả:
val c : Map<int,int> =
map [(1, 11); (2, 21); (3, 32); (4, 41); (5, 51); (6, 61)]
Cảm ơn! Những công việc này. – klactose
Hãy nhận biết rằng điều này tái tạo cả hai bản đồ từ đầu mà có thể rất chậm. Một giải pháp tốt hơn là của Robert nếu 'map1' là lớn và' map2' là nhỏ. –
Bạn có thể thực hiện điều này bằng Map.fold và Map.add, vì add là thực sự thêm/thay thế:
let map1 = Map.ofList [ 1, "one"; 2, "two"; 3, "three" ]
let map2 = Map.ofList [ 2, "two"; 3, "oranges"; 4, "four" ]
let newMap = Map.fold (fun acc key value -> Map.add key value acc) map1 map2
printfn "%A" newMap
Có lẽ lý do hợp nhất không được cung cấp ra khỏi hộp là bạn cần để đối phó với xung đột chính. Trong thuật toán kết hợp đơn giản này, chúng ta đơn giản lấy cặp giá trị khóa từ bản đồ thứ hai, đây có thể không phải là hành vi mà bạn muốn.
Thực ra đây chính xác là cách tôi thực hiện điều này: – Massif
Một cách khác là thế này:
let merge (a : Map<'a, 'b>) (b : Map<'a, 'b>) (f : 'a -> 'b * 'b -> 'b) =
Map.fold (fun s k v ->
match Map.tryFind k s with
| Some v' -> Map.add k (f k (v, v')) s
| None -> Map.add k v s) a b
Nó cho phép bạn quyết định giá trị bạn muốn nếu có khóa trùng lặp.
Ví dụ:
let a = Map([1,11;2,21;3,31;])
let b = Map([3,32; 4,41;5,51;6,61;])
merge a b (fun k (v, v') -> v + v');;
//Result
val it : Map<int,int> =
map [(1, 11); (2, 21); (3, 63); (4, 41); (5, 51); (6, 61)]
Chú ý rằng chìa khóa 3
là khác nhau.
Lưu ý: bạn không thực sự cần phải chỉ định các loại trên các thông số đầu vào của mình. – Benjol
- 1. Làm cách nào để hợp nhất tất cả các trường hợp thành một?
- 2. Làm cách nào để hợp nhất mảng và giữ phím?
- 3. trường hợp chung trong F # phân biệt đối xử đoàn
- 4. Làm cách nào để kết hợp nhiều trường trong QueryParser?
- 5. Trường hợp F # có nhạy cảm không?
- 6. Cách hiệu quả để hợp nhất 2 tệp CSS lớn
- 7. Làm cách nào để hợp nhất các bảng trong R?
- 8. Trường hợp không nhạy cảm với khóa f trong vim?
- 9. Làm cách nào để hợp nhất hai ngày trong JavaScript?
- 10. Làm cách nào để kết hợp hai Doctrine 2 ArrayCollection()
- 11. ngắn gọn mô hình phù hợp trên trường hợp duy nhất bị kỳ thị công đoàn trong F #
- 12. Kết hợp các yếu tố trang nhã nhất trong F #
- 13. Làm cách nào để hợp nhất trong JGit?
- 14. Làm cách nào để hợp nhất hai lớp trong PHP?
- 15. Làm cách nào để TeamCity tự động hợp nhất chi nhánh tính năng Git với chủ và không xây dựng trong trường hợp xung đột hợp nhất?
- 16. Cách thành ngữ để "hợp nhất" nhiều danh sách có cùng độ dài trong F #?
- 17. Làm thế nào để kết hợp 2 Iterator trong Scala?
- 18. làm cách nào để hợp nhất 2 hình ảnh mà không cần sử dụng đặt alpha?
- 19. Kết hợp MySQL 2 trong số 5 trường
- 20. PHP: Hợp nhất 2 Mảng đa chiều
- 21. Làm cách nào để hợp nhất 2 tệp .POT (tệp dịch)
- 22. trường hợp trong một trường hợp được chọn trong mysql
- 23. Tạo trình lặp hợp chất trong F #
- 24. Làm cách nào để hợp nhất hai danh sách IQueryable
- 25. Làm cách nào để hủy hợp nhất hg?
- 26. Làm thế nào để tạo ra một gói 2.x python - trường hợp đơn giản
- 27. Làm cách nào để nhận chuỗi ngẫu nhiên có dấu cách và trường hợp hỗn hợp?
- 28. Hợp nhất 2 hình ảnh với node.js?
- 29. So sánh F # trường hợp công đoàn phân biệt đối xử thông qua kết hợp mẫu
- 30. làm thế nào để hợp nhất hai bảng trong postgresql
bạn nên xem tại đây (http://stackoverflow.com/questions/590991/merging-two-ienumerablets), về cơ bản map1.Union (map2) nên hoạt động – dvhh
Giảm phân vị: sử dụng toán tử Union của LINQ mà bạn sẽ kết thúc với một IEnumerable của tuple, không hoàn toàn giống như một bản đồ. – Robert