寻求一种scala-esque方法来遍历一个可以访问"next"元素的列表

pdi*_*lag 4 functional-programming scala scala-2.8

我正在处理一个Polygon类,它包含一个顶点数组Array[Vec2](用Vec2一个简单的case类来定义x和y).

现在,我想实现一个函数来返回多边形的边缘Array[LineSegment](其中LineSegment又是一个定义开始和结束的简单案例类).

解决方案是创建将每个顶点连接到数组中的下一个顶点的线段,最后将最后一个顶点连接到第一个顶点.

我只习惯于命令式编程,所以这是我的必要方法:

def edges: Array[LineSegment] = {
  val result = new Array[LineSegment](vertices.length)

  for (i <- 0 to vertices.length - 2) {
    result.update(i, LineSegment(vertices.apply(i), vertices.apply(i + 1)))
  }
  result.update(edges.length - 1, LineSegment(vertices.head, vertices.last))

  result
}
Run Code Online (Sandbox Code Playgroud)

这很好用,但很简单.我想在这里使用函数式编程的优点,但我仍然坚持这一点.

我的想法是把它写成类似于这样的东西:

def edges: Array[LineSegment] = {
    for (v <- vertices) yield 
      LineSegment(v, if (v == vertices.last) vertices.head else /* next? */)
}
Run Code Online (Sandbox Code Playgroud)

问题是,在给定当前项目的情况,无法访问数组中的下一个项目v.

我已经读过关于sliding定义的方法IterableLike,但是这似乎是非旋转的,即它不会考虑第一个项目在最后一个项目之后,因此不会返回它.

那么什么是一个很好的"scala-esque"方法呢?

Deb*_*ski 10

当然你可以使用sliding:

(vertices :+ vertices.head) sliding 2
Run Code Online (Sandbox Code Playgroud)