使用两个列表的Scala排列

问题描述:

请实现以下目标的最佳方法是什么? 我有两个列表:使用两个列表的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

棘手比我想象的要多!第一步是计算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