Scala,将列表最后两项的总和添加到同一个列表中
我是scala新手,我正在尝试对列表中的元素运行一个操作,我想将结果添加到同一个列表的末尾 现在我有Scala,将列表最后两项的总和添加到同一个列表中,scala,Scala,我是scala新手,我正在尝试对列表中的元素运行一个操作,我想将结果添加到同一个列表的末尾 现在我有 func(pos - 1 , list) :: func(pos - 1 , list).takeRight(2).sum 它可以完成这项工作,但非常难看,并且两次调用“func”。我想要一些像: func(pos - 1 , list).<somefunction>.takeright(2).sum func(位置1,列表)…取右键(2)。求和 但是我不知道该怎么做。我不明
func(pos - 1 , list) :: func(pos - 1 , list).takeRight(2).sum
它可以完成这项工作,但非常难看,并且两次调用“func”。我想要一些像:
func(pos - 1 , list).<somefunction>.takeright(2).sum
func(位置1,列表)…取右键(2)。求和
但是我不知道该怎么做。我不明白为什么您的工作代码会很难看,但是您可以通过将结果存储在局部变量中来消除冗余的方法调用。看起来您希望将最后两个项目的总和追加到列表中,因此您希望使用
:+
操作符而不是:
,但请记住追加需要线性时间,而列表的前置是常量,因此您应该更喜欢后者
所以你能做的就是
val intermediate: List[Int] = func(pos - 1, list)
intermediate :+ intermediate.takeRight(2).sum
然而,为了向您展示在Scala中可以做什么,这里有一个更接近您所需输出的示例:
def main(args: Array[String]) {
println(func(4, Nil).append(_.takeRight(2).sum)) // List(1, 2, 3, 5)
}
def func(i: Int, l: List[Int]): List[Int] = List(1, 2, 3)
implicit class PimpMyList(list: List[Int]) {
def append(f: List[Int] => Int): List[Int] = {
list :+ f(list)
}
}
通过定义一个隐式类,您可以模拟一个更丰富的接口,并向List
的接口添加一个新方法append
。请注意,现在,list.append(x)
只是new-PimpMyList(list.append(x)
的隐式语法append
接受一个函数,该函数将List[Int]
转换为Int
,因此我们可以使用函数x=>x.takeRight(2).根据需要求和
请注意,我们还可以将隐式类设置为泛型:
implicit class PimpMyList[T](list: List[T]) {
def append(f: List[T] => T): List[T] = {
list :+ f(list)
}
}
println(List("foo", "bar", "baz").append(_.takeRight(2).reduce(_ + _))) // List(foo, bar, baz, barbaz)
您可以使用match
对某些表达式的结果应用某些转换:
List(1,2,3) match {
case x => x :+ x.takeRight(2).sum
}
//>> List(1, 2, 3, 5)
显示输入和预期输出的示例。如果需要追加,我建议不要使用列表<代码>列表
s的预结束速度很快,但追加速度很慢。考虑使用<代码>向量<代码>。