首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >List.sliding的替代品?

List.sliding的替代品?
EN

Stack Overflow用户
提问于 2012-09-02 05:20:30
回答 2查看 772关注 0票数 1

我正在尝试更熟悉函数式编程,我想知道是否有更优雅的方式将列表分组为2对,并对这些对应用函数。

代码语言:javascript
复制
case class Line(start: Vector, end: Vector) {
  def isLeftOf(v: Vector) = (end - start).cross(v - start) < 0
}

case class Polygon(vertices: List[Vector]) {
  def edges = (vertices.sliding(2).toList :+ List(vertices.last,vertices.head)).map(l => Line(l(0), l(1)))
  def contains(v: Vector) = {
    edges.map(_.isLeftOf(v)).forall(_ == true)
  }
}

我说的是这条线

代码语言:javascript
复制
def edges = (vertices.sliding(2).toList :+ List(vertices.last,vertices.head)).map(l => Line(l(0), l(1)))

有没有更好的方法来写这篇文章?

EN

回答 2

Stack Overflow用户

发布于 2012-09-02 07:30:13

代码语言:javascript
复制
val edges = (vertices, vertices.tail :+ vertices.head).zipped map Line

另请参阅以下问题:

How do you turn a Scala list into pairs?

Most concise way to combine sequence elements

票数 2
EN

Stack Overflow用户

发布于 2012-09-02 05:33:51

你可以通过这样做来简化一下:

代码语言:javascript
复制
case class Polygon(vertices: List[Vector]) {
  def edges = Line(vertices.last, vertices.head) :: vertices.sliding(2).map(l => Line(l(0), l(1))).toList
  def contains(v: Vector) = edges.forall(_.isLeftOf(v))
}

我做了三件事:

  1. 去掉了最后一行/头一行,这样它就不是
  2. toList to after map的一部分,这样你就可以映射到一个迭代器上,省去了构造两个contains来简单地用谓词调用forall的麻烦。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12231505

复制
相关文章

相似问题

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