我们可以改进我的代码以在 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]
我正在通过书中的练习来学习 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]