Scala分区基于距离对列表元素进行排序

时间:2018-12-18 22:28:02

标签: scala list

我是Scala和函数式编程的新手。我有一个任务想将Scala列表划分为子列表列表,其中任何子列表中每个元素之间的距离小于2。我发现在线某个地方的代码可以做到这一点,但我不知道如何该代码在内部有效,有人可以详细说明吗?

    def partition(input: List[Int], prev: Int, 
    splits: List[List[Int]]): List[List[Int]] = {
  input match {
    case Nil => splits
    case h :: t if h-prev < 2 => partition(t, h, (h :: splits.head) :: splits.tail)
    case h :: t => partition(t, h, List(h) :: splits)
  }
}


val input = List(1,2,3,5,6,7,10)
partition(input,input.head,List(List.empty[Int]))

结果如下:

List [List [Int]] =列表(List(10),List(7,6,5),List(3,2,1))

这是理想的结果。

2 个答案:

答案 0 :(得分:1)

此代码假定原始列表是从最小到最大排序的

它递归地工作,在每个调用中,输入仍然是列表的剩余内容,prev保留列表的前一个标题(input.head),splits保留到目前为止的splits

在每个呼叫中​​,我们查看输入(列表的左侧)

  • 如果为空(无),我们将完成拆分并返回拆分
  • 匹配使用模式匹配的其他两个选项 将输入分为标题和尾部(分别为h和t)
  • 第二个匹配项使用保护条件(如果),以检查输入的头部是否属于最新拆分,如果它确实将其添加到拆分中
  • 最后一个选择是创建一个新的拆分

答案 1 :(得分:1)

.value