使用模式匹配交换scala中的两个元素

使用模式匹配交换scala中的两个元素,scala,Scala,我想使用模式匹配来交换数组的前两个元素,我的代码如下所示: >scala val arr = Array(1,2,3,4,5) >arr match { case Array(a,b,rest @ _*) => Array(b,a,rest) // Array(2,1,Vector(3,4,5)) 但是,结果应该是数组(2,1,3,4,5)。如何修改它?您的问题不是将rest作为varargs传递,这是使用rest:*语法完成的。这告诉编译器将集合方法作为varargs传入

我想使用模式匹配来交换数组的前两个元素,我的代码如下所示:

>scala val arr = Array(1,2,3,4,5)

>arr match { case Array(a,b,rest @ _*) => Array(b,a,rest)
// Array(2,1,Vector(3,4,5))

但是,结果应该是
数组(2,1,3,4,5)
。如何修改它?

您的问题不是将
rest
作为varargs传递,这是使用
rest:*
语法完成的。这告诉编译器将集合方法作为varargs传入,它使用
Seq

val arr = Array(1, 2, 3, 4, 5)
arr match { case Array(a, b, rest @ _*) => Array(b, a +: rest: _*) }
这里有一个
数组。apply
方法接受第一个元素,后跟一个varargs,但是没有一个可以传入两个元素,然后再传入varargs。因此,在将整个内容作为varargs传递之前,我们需要将第二个元素前置到
Seq


这就是为什么我们最终得到了
a+:rest:.*
+:
在表达式的右侧调用,因此方法
+:
Seq
上定义,按照惯例,以
结尾的Scala方法是右关联的。

您的问题不是将
rest
作为varargs传递,这是使用
rest:
语法完成的。这告诉编译器将集合方法作为varargs传入,它使用
Seq

val arr = Array(1, 2, 3, 4, 5)
arr match { case Array(a, b, rest @ _*) => Array(b, a +: rest: _*) }
这里有一个
数组。apply
方法接受第一个元素,后跟一个varargs,但是没有一个可以传入两个元素,然后再传入varargs。因此,在将整个内容作为varargs传递之前,我们需要将第二个元素前置到
Seq


这就是为什么我们最终得到了
a+:rest:.*
+:
在表达式的右侧调用,因此方法
+:
Seq
上定义,按照惯例,以
结尾的Scala方法是右关联的。

谢谢您的回答!是否
rest
等于
Seq(3,4,5)
?除此之外,我还提出了一个解决方案
arr-match{case-Array(a,b,rest@*=>Array(b,a)++rest
谢谢你的回答!是否
rest
等于
Seq(3,4,5)
?除此之外,我还提出了一个解决方案
arr-match{case-Array(a,b,rest*>)++rest