加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 通过将列表项与邻居进行比较来对列表项进行分组

发布时间:2020-12-16 18:17:29 所属栏目:安全 来源:网络整理
导读:根据邻居值将值列表分组的最优雅方法是什么? 我所拥有的更广泛的背景是有一个行列表,需要分组成段落.我想能够说,如果两条线之间的垂直差异低于阈值,它们就在同一段落中. 我最终以不同的方式解决了这个问题,但我想知道这里的正确解决方案. case class Box(y:
根据邻居值将值列表分组的最优雅方法是什么?

我所拥有的更广泛的背景是有一个行列表,需要分组成段落.我想能够说,如果两条线之间的垂直差异低于阈值,它们就在同一段落中.

我最终以不同的方式解决了这个问题,但我想知道这里的正确解决方案.

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))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读