我们可以改进我的代码以在 Scala 中交换相邻的数组元素吗?

Can we improve on my code to swap adjacent array elements in Scala?

我正在通过书中的练习来学习 Scala "Scala for the Impatient"。一项练习要求:

Write a loop that swaps adjacent elements of an array of integers. For example, Array(1, 2, 3, 4, 5) becomes Array(2, 1, 4, 3, 5)

我用 3 种不同的方式做到了,其中一种是 follows.I 我很好奇这是否可以根据我内嵌的评论进行改进。

def swapWithGrouped(a: Array[Int]) = {
  a.grouped(2).map {
    // TODO: Can we use reverse here?
    case Array(x, y) => Array(y, x)
    // TODO: Can we use identity function here?
    case Array(x) => Array(x)
  }.flatten.toArray
}

不,据我所知,无法将模式绑定到名称。最接近这样做的是 @ 运算符,但它不适用于整个模式 - 仅适用于参数。

另一方面:

  def swapWithGrouped(a: Array[Int]) = {
    a.grouped(2).map{ _.reverse }.flatten.toArray
  }

应该没问题。我假设您不关心性能;如果这样做,代码将需要非常不同。

您可以使用 .flatMap 而不是 .map{..}.flatten
您实际上也不需要匹配单个元素数组,因此您可以简单地使用一个变量(尽管我觉得这真的取决于问题,有时在模式中显示对称性很好并且使意图更明确)。

所以 :

scala> def swapWithGrouped(a: Array[Int]) = {
         a.grouped(2).flatMap {
           case Array(x, y) => Array(y, x)
           case single => single
         }.toArray
       }
swapWithGrouped: (a: Array[Int])Array[Int]

scala> swapWithGrouped(a)  // a is Array(1,2,3,4,5)
res0: Array[Int] = Array(2, 1, 4, 3, 5)

Array(x,y) => Array(y,x) 也很容易读错,.reverse 使意图更加明确,并且具有额外的好处,您可以删除单元素大小写。

scala> def swapWithGrouped(a: Array[Int]) = a.grouped(2).flatMap(_.reverse).toArray
swapWithGrouped: (a: Array[Int])Array[Int]