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)
我只能提出棘手的方法和循环,但我想必须有一个更清洁的解决方案.
您可以尝试对列表进行排序,然后在其上使用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)
| 归档时间: |
|
| 查看次数: |
206 次 |
| 最近记录: |