请问以下最好的方法是什么?我有两个清单:
val l1 = List("a", "b")
val l2 = List(1, 2)
Run Code Online (Sandbox Code Playgroud)
我想生成这个:
List (
List(('a', 1), ('b', 1)),
List(('a', 1), ('b', 2)),
List(('a', 2), ('b', 1)),
List(('a', 2), ('b', 2))
)
Run Code Online (Sandbox Code Playgroud)
哪个基本上是第一个列表与第二个列表组合创建元组列表?考虑使用带滑动(2,2)的foldLeft来获得我的结果,但不能只是得到正确的结果.
解决方案应该适用于任何大小和类型,如List('a','b','c')和List("1","2")
谢谢
mis*_*ner 14
比我想象的更狡猾!第一步是计算n次L2的笛卡尔积,可使用的组合来完成List.fill,combinations和permutations(我有一个很难相信,有做这种没有更简单的方法,但我还没有发现任何):
def prod[T](lst: List[T], n: Int) = List.fill(n)(lst).flatten.combinations(n).flatMap(_.permutations)
Run Code Online (Sandbox Code Playgroud)
值n由列表的大小决定l1.在你的例子中prod(l2, 2)将给我们List(List(1, 1), List(1, 2), List(2, 1), List(2, 2)).剩下的只是一个应用程序map和zip.我们在一起
prod(l2, l1.size).map(l1.zip(_))
Run Code Online (Sandbox Code Playgroud)
输出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))
Run Code Online (Sandbox Code Playgroud)
最好的方法是使用 a 进行理解。比国际海事组织接受的解决方案干净得多:)
for {
i1 <- List('a', 'b', 'c')
i2 <- List(1, 2)
} yield List(i1, i2)
Run Code Online (Sandbox Code Playgroud)