2014-11-24 35 views
7

請實現以下目標的最佳方法是什麼? 我有兩個列表:使用兩個列表的Scala排列

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

,我想生成這個:

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

這基本上是第一個列表與第二組合創建的元組的列表清單? 正在考慮使用foldLeft與滑動(2,2)來獲得我的結果,但不能得到正確的結果。

該溶液應與任何大小和類型,像列表( 'A', 'B', 'C')和列表工作( 「1」, 「2」)

由於

+1

你嘗試過什麼?解決方案非常簡單。不禁想到這是作業... – gzm0 2014-11-24 09:39:12

回答

11

棘手比我想象的要多!第一步是計算l2的n次笛卡兒乘積,可以用List.fill,combinations,permutations(我很難相信沒有更簡單的方法來做到這一點,但我沒有'噸發現的任何):

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

n值由列表l1的大小來確定。在你的例子prod(l2, 2)將給我們List(List(1, 1), List(1, 2), List(2, 1), List(2, 2))。其餘的只是mapzip的應用。總之,我們有

l1 = List('a', 'b', 'c'), l2 = List("1", "2")
prod(l2, l1.size).map(l1.zip(_)) 

輸出:

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

哇。非常好。實際上非常棘手。感謝您的快速轉身。從代碼片段中學到了很多東西 – jts 2014-11-24 10:00:18