Scala中List的本地最大值

时间:2014-08-11 10:11:58

标签: scala scala-collections

这是一个简单的编码练习:找到给定列表中的所有局部最大值本地最大值是一个项目,它大于紧接其之前和之后的项目。

localMaxima of [2,9,5,6,1] is [9,6]
localMaxima of [2,3,4,1,5] == [4]
localMaxima of [1,2,3,4,5] == []

我写了这个函数如下:

def localMaxima(l: List[Int]) = 
  (l, l.tail, l.tail.tail).zipped.toList
    .filter(t => t._2 > t._1 && t._2 > t._3)
    .map(_._2)

您如何撰写本地最大值

3 个答案:

答案 0 :(得分:14)

scala> val l = List(2,9,5,6,1)
l: List[Int] = List(2, 9, 5, 6, 1)

scala> l.sliding(3).collect{ case a::b::c::Nil if a<b && b>c => b }.toList
res2: List[Int] = List(9, 6)

scala> val l = List(2,3,4,1,5)
l: List[Int] = List(2, 3, 4, 1, 5)

scala> l.sliding(3).collect{ case a::b::c::Nil if a<b && b>c => b }.toList
res3: List[Int] = List(4)

scala> val l = List(1,2,3,4,5)
l: List[Int] = List(1, 2, 3, 4, 5)

scala> l.sliding(3).collect{ case a::b::c::Nil if a<b && b>c => b }.toList
res4: List[Int] = List()

答案 1 :(得分:9)

我会使用滑动功能:

def localMaxima(list : List[Int]) = list.sliding(3).foldLeft(List[Int]()){
    case (seed, Seq(a, b,c)) => if(b > a && b > c) b:: seed else seed
}

答案 2 :(得分:4)

上使用for comprehension
val a = List(2,9,5,6,1)
像这样,

for ( (v,w,u) <- (a,a.drop(1),a.drop(2)).zipped if v < w && w > u ) yield w

<强>更新

像这样使用filter

(1 to a.size-2).filter(i => a(i-1) < a(i) && a(i) > a(i+1) ).map(a(_)).toList