假设我有以下一维数组或列表:
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))
这是错误的结果,因为它不是笛卡尔积!
答案 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)
如果有人有更好的解决方案,请分享一下:)