2014-11-24 27 views
7

Cách tốt nhất để đạt được những điều sau đây là gì? Tôi có hai danh sách:hoán vị Scala sử dụng hai danh sách

val l1 = List("a", "b") 
val l2 = List(1, 2) 

và tôi muốn tạo ra điều này:

List (
    List(('a', 1), ('b', 1)), 
    List(('a', 1), ('b', 2)), 
    List(('a', 2), ('b', 1)), 
    List(('a', 2), ('b', 2)) 
) 

cơ bản nào là danh sách đầu tiên kết hợp với thứ hai để tạo ra một danh sách các danh sách các hàng? Đã suy nghĩ về việc sử dụng một foldLeft với một trượt (2,2) để có được kết quả của tôi nhưng không thể chỉ nhận được kết quả đúng.

Các giải pháp nên làm việc với bất kỳ kích thước và định dạng, như List ('a', 'b', 'c') và Danh mục ("1", "2")

Cảm ơn

+1

Bạn đã thử gì? Giải pháp thực sự dễ dàng. Không thể không nghĩ rằng đây là bài tập về nhà ... – gzm0

Trả lời

11

phức tạp hơn hơn tôi nghi! Bước đầu tiên là tính toán sản phẩm Cartesian n-lần của l2, có thể được thực hiện bằng cách kết hợp List.fill, combinationspermutations (Tôi rất khó tin rằng không có cách nào dễ dàng hơn để thực hiện việc này, nhưng tôi đã ' t tìm thấy bất kỳ):

def prod[T](lst: List[T], n: Int) = List.fill(n)(lst).flatten.combinations(n).flatMap(_.permutations) 

giá trị của n được xác định bởi kích thước của danh sách l1. Trong ví dụ của bạn prod(l2, 2) sẽ cung cấp cho chúng tôi List(List(1, 1), List(1, 2), List(2, 1), List(2, 2)). Phần còn lại chỉ là một ứng dụng của mapzip. Cùng nhau, chúng ta có

prod(l2, l1.size).map(l1.zip(_)) 

Output cho l1 = List('a', 'b', 'c'), l2 = List("1", "2"):

List((a,1), (b,1), (c,1)) 
List((a,1), (b,1), (c,2)) 
List((a,1), (b,2), (c,1)) 
List((a,2), (b,1), (c,1)) 
List((a,1), (b,2), (c,2)) 
List((a,2), (b,1), (c,2)) 
List((a,2), (b,2), (c,1)) 
List((a,2), (b,2), (c,2)) 
+0

Waow. Rất đẹp. Khá phức tạp. Cảm ơn bạn đã nhanh chóng quay lại. Đã học được rất nhiều từ đoạn mã của bạn – jts

Các vấn đề liên quan