我有一个列表如下:
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
答案 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))