smellerbee
smellerbee

Reputation: 1883

How do I take slice from an array position to end of the array?

How do I get an array of array with elements like this? Is there an inbuilt scala api that can provide this value (without using combinations)?

e.g

val inp = Array(1,2,3,4)

Output

Vector(
  Vector((1,2), (1,3), (1,4)), 
  Vector((2,3), (2,4)), 
  Vector((3,4))
)

My answer is below. I feel that there should be an elegant answer than this in 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)

+Edit Added combination constraint.

Upvotes: 0

Views: 379

Answers (2)

joel
joel

Reputation: 7867

ORIGINAL ANSWER

Note This answer is OK only if the elements in the Seq are unique and sorted (according to <). See edit for the more general case.

With

val v = a.toVector

and by foregoing combinations, I can choose tuples instead and not have to cast at the end

for (i <- v.init) yield { for (j <- v if i < j) yield (i, j) }

or

v.init.map(i => v.filter(i < _).map((i, _)))

Not sure if there's a performance hit for using init on vector

EDIT

For non-unique elements, we can use the indices

val v = a.toVector.zipWithIndex
for ((i, idx) <- v.init) yield { for ((j, jdx) <- v if idx < jdx) yield (i, j) }

Upvotes: 0

Brian
Brian

Reputation: 20285

Using combinations(2) and groupBy() on the first element (0) of each combination will give you the values and structure you want. Getting the result as a Vector[Vector]] will require some conversion using 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))
)

Upvotes: 1

Related Questions