组列表元素的距离小于x

Mar*_*rco 5 scala scala-collections

我试图找出一种方法来根据元素之间的x距离对列表中的所有对象进行分组.

例如,如果距离是1那么

List(2,3,1,6,10,7,11,12,14)
Run Code Online (Sandbox Code Playgroud)

会给

List(List(1,2,3), List(6,7), List(10,11,12), List(14))
Run Code Online (Sandbox Code Playgroud)

我只能提出棘手的方法和循环,但我想必须有一个更清洁的解决方案.

Age*_*men 6

您可以尝试对列表进行排序,然后在其上使用foldLeft.基本上是这样的

  def sort = {
    val l = List(2,3,1,6,10,7,11,12,14)
    val dist = 1
    l.sorted.foldLeft(List(List.empty[Int]))((list, n) => {
      val last = list.head
      last match {
        case h::q  if Math.abs(last.head-n) > dist=> List(n) :: list
        case _ => (n :: last ) :: list.tail 
      }
    }
    )
  }
Run Code Online (Sandbox Code Playgroud)

结果似乎没问题但反过来了.如果需要,在需要时在列表上调用"反向".代码变成了

    val l = List(2,3,1,6,10,7,11,12,14)
    val dist = 1
    val res = l.sorted.foldLeft(List(List.empty[Int]))((list, n) => {
       val last = list.head
       last match {
         case h::q  if Math.abs(last.head-n) > dist=> List(n) :: (last.reverse :: list.tail)
        case _ => (n :: last ) :: list.tail
      }
    }
).reverse
Run Code Online (Sandbox Code Playgroud)