微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

寻求一种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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐