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

我正在处理一个polygon类,它在Array [Vec2]中保存一个顶点数组(Vec2是一个定义x和y的简单case类).

现在,我想实现一个函数来返回Array [Linesegment]中多边形的边缘(其中Linesegment也是一个定义start和end的简单case类).

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

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

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
}

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

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

def edges: Array[Linesegment] = {
    for (v <- vertices) yield 
      Linesegment(v,if (v == vertices.last) vertices.head else /* next? */)
}

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

我已经读过IterableLike中定义的滑动方法,但是这似乎是非旋转的,即它不会考虑最后一项后面的第一项,因此不会返回它.

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

解决方法

当然你可以使用滑动:

(vertices :+ vertices.head) sliding 2

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...