Question

I want to create a Scala sequence comprising tuples. The input is a text file like this:

A
B
C
D
E

I'm looking for an elegant way to construct "lagged" tuples like this:

(A, B), (B, C), (C, D), (D, E)
Was it helpful?

Solution

The easiest way to do this is by using the tail and zip:

val xs = Seq('A', 'B', 'C', 'D', 'E')
xs zip xs.tail

If efficiency is a concern (i.e. you don't want to create an extra intermediate sequence by calling tail and the Seq you use are not Lists, meaning that tail takes O(n)) then you can use views:

xs zip xs.view.tail

OTHER TIPS

I'm not quite sure how elegant it is, but this will work for at least all lists of more than 1 element:

val l = List('A,'B,'C,'D,'E,'F)
val tupled = l.sliding(2).map{case x :: y :: Nil => (x,y)}

tupled.toList
// res8: List[(Symbol, Symbol)] = List(('A,'B), ('B,'C), ('C,'D), ('D,'E), ('E,'F))

If you want something more elegant than that, I'd advise you look at Shapeless for nice ways to convert between lists and tuples.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top