Scala Iterable.slideing作为元组的输出

Scala Iterable.slideing作为元组的输出,scala,collections,Scala,Collections,集合上的方法sliding以X[Iterable[a]]的形式返回给定大小的滑动窗口,X是集合的类型,a是元素类型。通常我需要两三个元素,我更喜欢命名它们。滑动(2)的一个难看的解决方法如下: points.sliding(2).foreach{ twoPoints => val (p1,p2) = (twoPoints.head,twoPoints.last) //do something } 这很糟糕,只适用于两种元素。还要注意 (a,b) = (twoPoi

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

points.sliding(2).foreach{ twoPoints =>
      val (p1,p2) = (twoPoints.head,twoPoints.last)
      //do something
}
这很糟糕,只适用于两种元素。还要注意

(a,b) = (twoPoints(0),twoPoints(1))

不起作用。

两点似乎是一个列表。试试这个:

points.sliding(3).foreach{ _ match {
  case Seq(a, b, c) => {
      //do something
  }
}
你会惊讶于什么样的功夫模式匹配能让你逍遥法外。

就在上周,我做了很多这样的回答

points.sliding(2).foreach { case X(p1, p2) => ... }
如果
数组
,则将
X
替换为
数组
。如果是
列表
,则将
X
替换为
列表
,依此类推


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

我最近想在滑动迭代器中增加一些糖,因此我提出了以下建议:

隐式类slidengops[A](s:Seq[A]){
def slidengpairs=(s,s.tail).拉链
def slidengtriples=(s,s.tail,s.tail.tail)。拉链
}
这适用于任何
Seq
,但对于
List
可能最有效
.zipped
返回一个(或对于3元素元组)对象,该对象定义了几种常见的高阶方法,以便它们的参数采用多个参数,因此您可以编写:

points.slidingPairs.foreach{(a,b)=>…}
甚至:

(1到10)。SlidengTriples.map(+++)

如果您想让实现对非列表类型真正有效,可以进一步优化它。

我不太确定问题是什么。上周我也抱怨过同样的事情。(A?)问题当然是,由于一些愚蠢的/不幸运的/无法解释的设计,很明显,您只能有大小为20左右的元组。因此,对于比这更大的输入,
slideing
将无法很好地定义。@Raphael:此外,元组没有比Product更具体的父类。同样,这样一个类的impl将不可避免地是一个庞大的switch语句,它不需要输入元素的数量。谁会想编码呢。像
Array[(Any,ClassManifest)]
这样的东西,再配上一些施法魔法,也可以完成这项工作。这个特殊的应用程序甚至只需要一个同属元组的“漂亮”实现。另外,我不太明白为什么
apply(#)
是元组的访问器,但这很难理解
。在任何情况下,
Tuple
的硬编码肯定会让人感到恶心。好吧,它在repl中工作,但在项目中给了我一个错误。@ziggystar:哦,孩子。在scala 2.8.0上适用于我。你是哪个版本的?还可以尝试case Seq(p1,p2)=>@Ziggystar:闻起来像是版本问题。您可能有多个版本依赖项,maven插件对此进行检查。@ziggystar-您确定
是项目中的一个列表吗?如果是其他类型的集合(例如数组),则滑动条目将不会是列表,它们将是该集合转化为(例如另一个数组)的最自然的东西。
匹配
。你可以直接从
foreach
转到
case
。我不期望它会变得更好,所以我接受了这个。