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)
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 List
s, meaning that tail
takes O(n)) then you can use views:
xs zip xs.view.tail
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With