scala - Scala 如何将列表元素与下一个元素进行比较,以获得这里元素?

  显示原文与译文双语对照的内容

如我在标题中注意到的,如果元素比较,则如何比较索引N的元素,如果元素相同。 我知道我可以使用 in,获得一组独特的元素,但这不能帮助我,因为列表可以包含重复元素。


val ll = List(1, 2, 3, 6, 3, 7, 5, 5, 6, 3)


//Desired output: List(1, 2, 3, 6, 3, 7, 5, 6, 3)



我使用zipWithIndex获得一个"接近工作解决方案"。收集,但当我在里面比较时,索引运行 OutOfBounds 。 如果可以在内部使用两个条件,首先检查索引= ( 列表。size-1 )的最大索引,然后比较 list(index)!= 列表( 索引) 。

我没有成功的( 因为 OutOfBounds ),是:


times.zipWithIndex.collect


{


 case (element, index)


//index+1 will be incremented out of my list


 if (times(index)!= times(index+1)) => times(index)


}



如果可以使用一个更多条件来限制索引,但不能使用两条条件,这可以能会工作:


times.zipWithIndex.collect


{


 case (element, index)


 if (index <times.size)


 if (times(index)!= times(index+1)) => times(index)


}



我欣赏任何一种选择。

时间: 原作者:

你可以使用自身的zip列表,删除第一个元素,以便将元素与N + 1比较。 你只需要附加最后一个元素( 你可能希望使用 ListBuffer 作为附加最后一个元素需要复制列表) 。


val r = times.zip(times.drop(1)).withFilter(t => t._1!= t._2).map(_._1) :+ times.last




scala> val times = List(1, 2, 3, 6, 3, 7, 5, 5, 6, 3)


times: List[Int] = List(1, 2, 3, 6, 3, 7, 5, 5, 6, 3)



scala> val r = times.zip(times.drop(1)).withFilter(t => t._1!= t._2).map(_._1) :+ times.last


r: List[Int] = List(1, 2, 3, 6, 3, 7, 5, 6, 3)



原作者:

怎么办?


ll.foldLeft(List[Int]())((acc, x) => acc match {case Nil => List(x) case y => if (y.last == x) y else y :+ x})



下面是使用滑动函数的选项:


val ll = List(1, 2, 3, 6, 3, 7, 5, 5, 6, 3)


ll.sliding(2)


. filter( t => t.length> 1 && t(0)!= t(1) )


. map( t => t(0) )


. toList :+ ll.last



...