使用for和yield scala交换数组值

时间:2012-04-14 23:59:44

标签: scala for-loop iteration swap 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

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

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

由于

9 个答案:

答案 0 :(得分:39)

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

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

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

答案 1 :(得分:13)

如果你不使用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)

答案 2 :(得分: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)

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

答案 3 :(得分:0)

另一种简单的收益解决方案:

def swapAdjacent(array: ArrayBuffer[Int]) = {
    for (i <- 0 until array.length) yield (
        if (i % 2 == 0)
            if (i == array.length - 1) array(i) else array(i + 1)
        else array(i - 1)
    )
}

答案 4 :(得分:0)

这是我的解决方案

  def swapAdjacent(a: Array[Int]):Array[Int] =
    (for(i <- 0 until a.length) yield
      if (i%2==0 && (i+1)==a.length) a(i) //last element for odd length
      else if (i%2==0) a(i+1)
      else a(i-1)
    ).toArray

https://github.com/BasileDuPlessis/scala-for-the-impatient/blob/master/src/main/scala/com/basile/scala/ch03/Ex03.scala

答案 5 :(得分:0)

如果你在Scala中为不耐烦做练习3.2和3.3,这里都是我的答案。它们与移动的逻辑相同。

/** Excercise 3.2 */
for (i <- 0 until a.length if i % 2 == 1) {val t = a(i); a(i) = a(i-1); a(i-1) = t }
/** Excercise 3.3 */
for (i <- 0 until a.length) yield { if (i % 2 == 1) a(i-1) else if (i+1 <= a.length-1) a(i+1) else a(i) }

答案 6 :(得分:0)

for (i <- 0 until arr.length-1 by 2) { val tmp = arr(i); arr(i) = arr(i+1); arr(i+1) = tmp }

我最近开始学习Scala,我的github上提供了 Scala for the Impatient (第1版)中的所有解决方案:

第2章 https://gist.github.com/carloscaldas/51c01ccad9d86da8d96f1f40f7fecba7

第3章 https://gist.github.com/carloscaldas/3361321306faf82e76c967559b5cea33

答案 7 :(得分:0)

我有我的解决方案,但没有收益。也许有人会发现它很有用。

def swap(x: Array[Int]): Array[Int] = {
    for (i <- 0 until x.length-1 by 2){
      var left = x(i)
      x(i) = x(i+1)
      x(i+1) = left
    }
    x
  }

答案 8 :(得分:0)

假设数组不为空,那么你去:

val swapResult = for (ind <- arr1.indices) yield {
  if (ind % 2 != 0) arr1(ind - 1)
  else if (arr1(ind) == arr1.last) arr1(ind)
  else if (ind % 2 == 0) arr1(ind + 1)
}