8

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を使用して正しい反転を取得する方法を指摘できますか?

ありがとう

4

9 に答える 9

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

または、必要/歩留まりが必要な場合(この場合はそれほど簡潔ではなく、実際には同じコードに拡張されます):

(for {b <- a.grouped(2); c <- b.reverse} yield c).toArray
于 2012-04-15T06:39:40.540 に答える
17

使用しなかった方が簡単です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)
于 2012-04-15T00:19:12.163 に答える
9

OPがせっかちな人のためにScalaを読んでいるかどうかはわかりませんが、これは演習3.3でした。

私はマップソリューションが好きですが、まだその章に載っていないので、これは必要なfor/yieldを使用した私の醜い実装です。おそらく、いくつかのyieldロジックをガード/定義に移動することができます。

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

私はJavaの人なので、このアサーションの確認はしていませんが、マップ/グループ化とイテレーターのオーバーヘッドが何であるかについて興味があります。すべてが同じJavaバイトコードにコンパイルされるのではないかと思います。

于 2014-01-28T21:58:01.073 に答える
1

もう1つの単純な、利回りのソリューション:

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)
    )
}
于 2014-03-17T09:17:46.743 に答える
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

于 2014-05-20T16:06:34.843 に答える
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) }
于 2015-10-07T17:06:54.480 に答える
0
for (i <- 0 until arr.length-1 by 2) { val tmp = arr(i); arr(i) = arr(i+1); arr(i+1) = tmp }

私は最近Scalaを学び始めましたが、Scala for the Impatient(第1版)のすべてのソリューションは、私のgithubで入手できます。

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

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

于 2016-09-26T19:48:08.453 に答える
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
  }
于 2017-01-11T20:32:46.770 に答える
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)
}
于 2021-02-14T00:46:50.847 に答える