我对Scala还是很陌生。我整天都在寻找这个。我正在尝试从另一个包含带有所述名称的对象的向量中获取名称的向量。
要正确地改写一下:我有几个点,两个点创建了一个线段(“起点”和“到”点),多个线段创建了一条路径。现在,我要做的是列出路径内的点,即参数中的所述路径。
到目前为止,我已经成功创建了实体并提出了以下功能:
Get all the "From" points from a path
问题在于我无法得到最后一点,因为它仅列出了“ from”。有什么简单的方法可以解决吗?
非常感谢您的帮助!
答案 0 :(得分:0)
我们可以假定第一个path(n).to == path(n + 1).from
等吗?
如果是这样:
import scala.annotation.tailrec
@tailrec
def getPoints(points: List[Element]): List[Point] = points match{
case Nil => Nil
case e :: Nil => List(e.from, e.to)
case x :: xs => x.from :: getPoints(xs)
}
答案 1 :(得分:0)
您当然可以使用stopInPath()函数和给出的创造性递归答案。我将添加一个非常好的问题,通过它您可以学习Scala核心库中已有的一些强大的功能编程技术:即,使用flatMap()将包含一个类型的类型的实例转换为一个类型的实例。同一类型的实例包含另一个完全不同的类型。目标是正式定义转换并处理任何错误。在这种情况下,我们将线段向量转换为点向量。您可以在此站点和其他站点上找到关于功能理论的许多有用信息(monads等),但是monad的基本思想(词源:“不可约奇点”)是将Vector [A]转换为Vector [B],其中明确定义和处理了副作用和错误,并且A和B可以是相当多的东西,但是包含类型(在这种情况下为Vector)保持不变。现在,转到代码:
case class Point(x: Int, y: Int)
case class Segment(from: Point, to: Point)
val path: Vector[Segment] = Vector(Segment(Point(1,2),Point(2,4)),
Segment(Point(3,6), Point(4,8)))
val points: Vector[Point] = path.flatMap{seg => Vector(seg.from, seg.to)}
产量:
点:Vector [Point] = Vector( 点(1,2), 点(2,4), 点(3,6), 点(4,8) )
我本可以省略显式类型定义val path: Vector[Segment]
和val points: Vector[Point]
,让类型推断将代码缩短为val path = ...
和val points = ...
,但我留给他们澄清我的观点:从Vector [Segment]到Vector [Point]的转换。