如何获得具有此类元素的array数组?是否有内置的Scala API可以提供此值(不使用组合)?
例如
val inp = Array(1,2,3,4)
输出
Vector(
Vector((1,2), (1,3), (1,4)),
Vector((2,3), (2,4)),
Vector((3,4))
)
我的回答如下。我觉得应该在scala中提供一个比这更好的答案。
val inp = Array(1,2,3,4)
val mp = (0 until inp.length - 1).map( x => {
(x + 1 until inp.length).map( y => {
(inp(x),inp(y))
})
})
print(mp)
+编辑 添加了组合约束。
答案 0 :(得分:1)
在每个组合的第一个元素(combinations(2)
)上使用groupBy()
和0
将为您提供所需的值和结构。以Vector[Vector]]
的形式获取结果将需要使用toVector
scala> inp.combinations(2).toList.groupBy(a => a(0)).values
res11: Iterable[List[Array[Int]]] = MapLike.DefaultValuesIterable
(
List(Array(2, 3), Array(2, 4)),
List(Array(1, 2), Array(1, 3), Array(1, 4)),
List(Array(3, 4))
)
答案 1 :(得分:0)
原始答案
注意仅当Seq中的元素是唯一且已排序(根据<
)时,此答案才是确定的。有关更一般的情况,请参见编辑。
使用
val v = a.toVector
通过前面的combinations
,我可以选择元组,而不必在末尾强制转换
for (i <- v.init) yield { for (j <- v if i < j) yield (i, j) }
或
v.init.map(i => v.filter(i < _).map((i, _)))
不确定在vector上使用init是否会有性能上的影响
编辑
对于非唯一元素,我们可以使用索引
val v = a.toVector.zipWithIndex
for ((i, idx) <- v.init) yield { for ((j, jdx) <- v if idx < jdx) yield (i, j) }