循环时典型嵌套的功能版本



我希望这个问题可能会让功能性编程爱好者。我可以要求一种方法将以下代码片段转换为Scala中的纯函数实现,并在可读性和执行速度之间取得良好的平衡?

描述:对于序列中的每个元素,产生一个子序列包含在当前元素(包括本身)之后的元素,其距离小于给定阈值。阈值交叉后,就不必处理其余元素

  def getGroupsOfElements(input : Seq[Element]) : Seq[Seq[Element]] = {
    val maxDistance = 10 // put any number you may
    var outerSequence = Seq.empty[Seq[Element]]
    for (index <- 0 until input.length) {
      var anotherIndex = index + 1
      var distance = input(index) - input(anotherIndex) // let assume a separate function for computing the distance
      var innerSequence = Seq(input(index))
      while (distance < maxDistance && anotherIndex < (input.length - 1)) {
        innerSequence = innerSequence ++ Seq(input(anotherIndex))
        anotherIndex = anotherIndex + 1
        distance = input(index) - input(anotherIndex)
      }
      outerSequence = outerSequence ++ Seq(innerSequence)
    }
    outerSequence 
  }

您知道,如果您添加了要与代码一起完成的工作的描述,这将变得容易一吨。

无论如何,这可能是您想要的东西。

def getGroupsOfElements(input: Seq[Element]): Seq[Seq[Element]] =
  input.tails.map(x => x.takeWhile(y => distance(x.head,y) < maxDistance)).toSeq

最新更新