首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Iterable.sliding作为元组的输出

Iterable.sliding作为元组的输出
EN

Stack Overflow用户
提问于 2011-01-17 20:48:20
回答 3查看 5.4K关注 0票数 10

集合上的滑动方法以X[Iterable[A]]的形式返回给定大小的滑动窗口,其中X是集合的类型,A是元素类型。通常,我需要两个或三个元素,我更愿意给它们命名。sliding(2)的一个难看的解决方法是:

代码语言:javascript
复制
points.sliding(2).foreach{ twoPoints =>
      val (p1,p2) = (twoPoints.head,twoPoints.last)
      //do something
}

这很糟糕,只适用于两个元素。还请注意

代码语言:javascript
复制
(a,b) = (twoPoints(0),twoPoints(1))

不起作用。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-18 11:08:27

就在上周,我在this的回答中做了很多这样的事情。

代码语言:javascript
复制
points.sliding(2).foreach { case X(p1, p2) => ... }

如果pointsArray,那么将X替换为Array。如果是List,则将X替换为List,依此类推。

请注意,您正在进行模式匹配,因此需要对参数进行{}而不是()

票数 16
EN

Stack Overflow用户

发布于 2011-01-17 21:00:38

twoPoints似乎是一个列表。试试这个:

代码语言:javascript
复制
points.sliding(3).foreach{ _ match {
  case Seq(a, b, c) => {
      //do something
  }
}

你会惊讶于什么形式的模式匹配可以让你逃脱。

票数 4
EN

Stack Overflow用户

发布于 2017-10-29 23:49:31

我最近想在我的滑动迭代器中多加一点糖,所以我想出了这个:

代码语言:javascript
复制
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 )对象,该对象定义了几个常见的高阶方法,以便它们的参数接受多个参数,这样您就可以编写:

代码语言:javascript
复制
points.slidingPairs.foreach { (a, b) => ... }

甚至:

代码语言:javascript
复制
(1 to 10).slidingTriples.map(_ + _ + _)

如果希望实现对于非列表类型有效,则可以进一步优化实现。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4717742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档