如何将每个项目及其右边的所有项目都放在列表中? [scala]

时间:2018-11-17 16:36:41

标签: scala scala-collections

假设我有以下一维数组或列表:

val a = Array(1, 5, 7, 9)

我想生成一个结果(二维数组或元组列表),其中

Array[(1,5), (1,7), (1,9), (5,7), (5,9), (7,9)]

如何在Scala中做到这一点?

这是我尝试过的:

val c = for (a_ <- a; b_ <- a) yield (a_, b_)

问题c现在具有:

Array((1,1), (1,5), (1,7), (1,9), (5,1), (5,5), (5,7), (5,9), (7,1), (7,5), (7,7), (7,9), (9,1), (9,5), (9,7), (9,9))

这是错误的结果,因为它不是笛卡尔积!

2 个答案:

答案 0 :(得分:1)

要缩短代码?这是一线。

a.zipWithIndex.flatMap{case (n,x) => a.drop(x+1).map(n -> _)}
//res0: Array[(Int, Int)] = Array((1,5), (1,7), (1,9), (5,7), (5,9), (7,9))

或者也许是这个

a.combinations(2).map(x=>(x(0),x(1))).toArray

答案 1 :(得分:0)

这是我解决的方法:我力所能及的:

var tmpRes: ListBuffer[List[(Int, Int)]] = ListBuffer()
(0 until itemSet.size) foreach { i =>
      val left = List(itemSet(i))
      val (_, right) = itemSet.splitAt(i+1)
      val res:List[(Int, Int)] = for (left_ <- left; right_ <- right) yield (left_, right_)
      tmpRes += res
}

var combinations: ListBuffer[(Int, Int)] = tmpRes.flatMap(x => x)
combinations.foreach(println)

如果有人有更好的解决方案,请分享一下:)