集合上的滑动方法以X[Iterable[A]]的形式返回给定大小的滑动窗口,其中X是集合的类型,A是元素类型。通常,我需要两个或三个元素,我更愿意给它们命名。sliding(2)的一个难看的解决方法是:
points.sliding(2).foreach{ twoPoints =>
val (p1,p2) = (twoPoints.head,twoPoints.last)
//do something
}这很糟糕,只适用于两个元素。还请注意
(a,b) = (twoPoints(0),twoPoints(1))不起作用。
发布于 2011-01-18 11:08:27
就在上周,我在this的回答中做了很多这样的事情。
points.sliding(2).foreach { case X(p1, p2) => ... }如果points是Array,那么将X替换为Array。如果是List,则将X替换为List,依此类推。
请注意,您正在进行模式匹配,因此需要对参数进行{}而不是()。
发布于 2011-01-17 21:00:38
twoPoints似乎是一个列表。试试这个:
points.sliding(3).foreach{ _ match {
case Seq(a, b, c) => {
//do something
}
}你会惊讶于什么形式的模式匹配可以让你逃脱。
发布于 2017-10-29 23:49:31
我最近想在我的滑动迭代器中多加一点糖,所以我想出了这个:
implicit class SlidingOps[A](s: Seq[A]) {
def slidingPairs = (s, s.tail).zipped
def slidingTriples = (s, s.tail, s.tail.tail).zipped
}这适用于任何Seq,但在List中可能是最有效的。.zipped返回一个scala.runtime.Tuple2Zipped (或3元素元组的Tuple3Zipped )对象,该对象定义了几个常见的高阶方法,以便它们的参数接受多个参数,这样您就可以编写:
points.slidingPairs.foreach { (a, b) => ... }甚至:
(1 to 10).slidingTriples.map(_ + _ + _)如果希望实现对于非列表类型有效,则可以进一步优化实现。
https://stackoverflow.com/questions/4717742
复制相似问题