gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:01:03 25 4
gpt4 key购买 nike

根据相邻值将值列表分组的最优雅方法是什么?

我拥有的更广泛的上下文是有一个行列表,需要将其分组为段落。我想能够说,如果两条线之间的垂直差异低于阈值,则它们在同一段落中。

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

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, 2, 4), List(8, 9, 10), List(15, 16))

或两个衬里以获得轻微的效率增益
val ys = zs.reverse
ys.drop(1).foldLeft(List(List(ys.head)))
((acc, e)=> if (closeEnough(e, acc.head.head))
(e::acc.head)::acc.tail
else
List(e)::acc)
// List(List(1, 2, 4), List(8, 9, 10), List(15, 16))

关于scala - 通过将列表项与其邻居进行比较来对列表项进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37816015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com