我正在尝试使用以下功能交换列表中的前2个元素。
def swap_list(a:List[Int]):List[Int]={
a match {
case x::y::Nil => List(y,x)
case List(x,y,rest @ _*) => List(y,x)
case _ => a
}
}
swap_list(List(10,20,30))
这有效。但是,如果我尝试包含rest
,则会出现类似
case List(x,y,rest @ _*) => List(y,x) +: rest
下面的错误
Error:(27, 50) type mismatch;
found : Seq[Any]
required: List[Int]
case List(x,y,rest @ _*) => List(y,x) +: rest
当我在定义中指定函数结果类型时,为什么在错误消息中得到Seq [Any]?
我需要返回List(20,10,30)。该如何解决?。
答案 0 :(得分:5)
显然,scala List
中的运算符令人困惑。您需要使用++
,
def swap_list(a:List[Int]):List[Int]={
a match {
case x::y::Nil => List(y,x)
case List(x,y,rest @ _*) => List(y,x) ++ rest
case _ => a
}
}
val newList = swap_list(List(10, 20, 30))
println(newList) //List(20, 10, 30)
List
个运算符的摘要,
1)使用List
或+:
::
上
scala> 1000 +: List(1, 2, 3)
res1: List[Int] = List(1000, 1, 2, 3)
scala> 1000 :: List(1, 2, 3)
res4: List[Int] = List(1000, 1, 2, 3)
2)使用List
附加在:+
上
scala> List(1, 2, 3) :+ 100
res2: List[Int] = List(1, 2, 3, 100)
3)使用++
组合列表,与in haskell
scala> List(1, 2, 3) ++ List(4, 5, 6)
res3: List[Int] = List(1, 2, 3, 4, 5, 6)
答案 1 :(得分:5)
好吧,当祈祷解决方案起作用时,并清楚地说明了问题(应该是恕我直言的答案)。
对于此问题,我认为值得分享一个“更好” 解决方案,因为串联列表非常昂贵,因此最好在它们之前添加元素。
def swapList[T](l: List[T]): List[T] = l match {
case Nil => Nil
case x :: Nil => x :: Nil
case x :: y :: xs => y :: x :: xs
}
swapList(List(10,20,30)) // res0: List[Int] = List(20, 10, 30).
答案 2 :(得分:3)
您需要用++
代替+:
,因为后者是针对单个元素的。
答案 3 :(得分:3)
最简单的实现是这样:
def swap_list(a: List[Int]): List[Int] =
a match {
case x :: y :: tail => y :: x :: tail
case _ => a
}