如何从数组位置到数组末尾获取切片?

时间:2018-08-22 16:16:28

标签: arrays scala

如何获得具有此类元素的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)

+编辑 添加了组合约束。

2 个答案:

答案 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) }