根据邻居值将值列表分组的最优雅方法是什么?
我所拥有的更广泛的背景是有一个行列表,需要分组成段落.我想能够说,如果两条线之间的垂直差异低于阈值,它们就在同一段落中.
我最终以不同的方式解决了这个问题,但我想知道这里的正确解决方案.
case class Box(y: Int) val list = List(Box(y=1),Box(y=2),Box(y=5)) def group(list: List[Box],threshold: Int): List[List[Box]] = ??? val grouped = group(list,2) > List(List(Box(y=1),Box(y=2)),List(Box(y=5)))
我看过groupBy()
,但一次只能使用一个元素.我还尝试了一种使用sliding()
预先计算差异的方法,但是从原始集合中检索元素变得很尴尬.
解决方法
这是一个班轮.推广类型留给读者练习.
使用整数和绝对差异而不是线条和间距来避免混乱.
val zs = List(1,2,4,8,9,10,15,16) def closeEnough(a:Int,b:Int) = (Math.abs(b -a) <= 2) zs.drop(1).foldLeft(List(List(zs.head))) ((acc,e)=> if (closeEnough(e,acc.head.head)) (e::acc.head)::acc.tail else List(e)::acc) .map(_.reverse) .reverse // List(List(1,4),List(8,10),List(15,16))
或两个衬垫,效率略有提高
val ys = zs.reverse ys.drop(1).foldLeft(List(List(ys.head))) ((acc,acc.head.head)) (e::acc.head)::acc.tail else List(e)::acc) // List(List(1,16))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。