使用for和yield scala交换数组值

sc_*_*ray 7 iteration swap for-loop scala yield

我试图使用for和yield交换我的数组中的每对值,到目前为止我非常不成功.我试过的内容如下:

val a = Array(1,2,3,4,5) //What I want is Array(2,1,4,3,5)

for(i<-0 until (a.length-1,2),r<- Array(i+1,i)) yield r
Run Code Online (Sandbox Code Playgroud)

上面给出的片段返回向量2,1,4,3(省略了5)

有人可以指出我在这里做错了什么以及如何使用for和yield得到正确的逆转?

谢谢

Rog*_*ach 39

a.grouped(2).flatMap(_.reverse).toArray
Run Code Online (Sandbox Code Playgroud)

或者如果你需要/ yield(在这种情况下更简洁,实际上扩展到相同的代码):

(for {b <- a.grouped(2); c <- b.reverse} yield c).toArray
Run Code Online (Sandbox Code Playgroud)


dhg*_*dhg 14

如果你不使用它会更容易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)
Run Code Online (Sandbox Code Playgroud)

  • 这可能是一种成熟的做事方式.我正在学习scala,并想知道是否可以使用for/yield完成相同的操作. (3认同)

Jos*_*ust 9

我不知道OP是否正在阅读Scala for the Impatient,但这是练习3.3.

我喜欢地图解决方案,但我们还不在那一章,所以这是我使用/ yield所需的丑陋实现.您可以将一些良率逻辑移动到一个保护/定义中.

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

我是一个Java人,所以我没有确认这个断言,但我很好奇地图/分组和迭代器的开销是多少.我怀疑这一切都归结为相同的Java字节代码.