Swapping array values with for and yield scala

a.grouped(2).flatMap(_.reverse).toArray

or if you need for/yield (much less concise in this case, and in fact expands to the same code):

(for {b <- a.grouped(2); c <- b.reverse} yield c).toArray

It would be easier if you didin't use for/yield:

a.grouped(2)
  .flatMap{ 
    case Array(x,y) => Array(y,x)
    case Array(x) => Array(x)
  }.toArray // Array(2, 1, 4, 3, 5)

I don't know if the OP is reading Scala for the Impatient, but this was exercise 3.3 .

I like the map solution, but we're not on that chapter yet, so this is my ugly implementation using the required for/yield. You can probably move some yield logic into a guard/definition.

for( i <- 0 until(a.length,2); j <- (i+1).to(i,-1) if(j<a.length) ) yield a(j)

I'm a Java guy, so I've no confirmation of this assertion, but I'm curious what the overhead of the maps/grouping and iterators are. I suspect it all compiles down to the same Java byte code.