Scala Multiply将元素列表彼此相邻

时间:2018-02-02 18:30:42

标签: scala

我有一个列表如下:

val a = List(1,2,3,4,5,6)

现在我想将list元素相互相乘,如下所示:

((1*2),(1*3),(1*4),(1*5),(1*6),(2*3),(2*4),(2*5),(2*6),(3*4),(3*5),(3*6),(4*5),(4*6),(5*6))

我试过如下:

a.map(x=>a.tail.filterNot(_.equals(x)).map(y=>(x,y))).flatten

但它没有像预期的那样返回tuples.s

2 个答案:

答案 0 :(得分:5)

a.combinations(2).map(_.product)

这会产生Iterator[Int]。如果您需要.toList结果,则可以在最后标记List。对于任何大小的a,这也是安全的,包括空的List[Int]

答案 1 :(得分:2)

您可以使用.tails方法,该方法返回:

scala> a.tails.toList
res2: List[List[Int]] = List(List(1, 2, 3, 4, 5, 6), List(2, 3, 4, 5, 6), List(3, 4, 5, 6), List(4, 5, 6), List(5, 6), List(6), List())

然后对于每个大小大于1的子列表,映射尾部,返回元组。最后,展平结果列表:

scala> a.tails.toList.collect { case h::tl if tl != Nil => tl.map(h -> _) }.flatten
res5: List[(Int, Int)] = List((1,2), (1,3), (1,4), (1,5), (1,6), (2,3), (2,4), (2,5), (2,6), (3,4), (3,5), (3,6), (4,5), (4,6), (5,6))