合并scala列表中的元素

Edw*_*ale 4 algorithm scala

我正在尝试将以下Java代码段移植到Scala.它采用MyColor对象列表并合并彼此增量内的所有对象.这似乎是一个可以使用Scala的一些功能部分优雅地解决的问题.有小费吗?

List<MyColor> mergedColors = ...;
MyColor lastColor = null;
for(Color aColor : lotsOfColors) {
  if(lastColor != null) {
    if(lastColor.diff(aColor) < delta) {
      lastColor.merge(aColor);
      continue;
    }
  }
  lastColor = aColor;
  mergedColors.add(aColor);
}
Run Code Online (Sandbox Code Playgroud)

ams*_*ams 7

这是另一个递归解决方案,它具有尾递归的优点(因此没有堆栈溢出的可能性)但是在缺点上会进行大量的列表操作,因此可能会浪费.最后反向调用是将输出颜色放回输入顺序,但如果您不关心排序则不需要.

def processColors(colors: List[Color], delta: Double): List[Color] = {
  def process(in: List[Color], accum: List[Color]): List[Color] = in match {
      case x :: y :: ys if x.diff(y) < delta => process( x.merge(y) :: ys, accum )
      case x :: xs                           => process( xs, x :: accum )
      case Nil                               => accum
    }

  process(colors, Nil).reverse
}
Run Code Online (Sandbox Code Playgroud)