使用模式匹配交换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