gpt4 book ai didi

scala - 根据从最小数字开始的范围将数字列表分组

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

假设有数字列表和范围值,我想将它们分组,其中每组中的项目都在最低数字的范围内,然后对它们进行排序。

例如,我有一个列表 val l = List(1,2,3,4,5,6,7,8,9,10)范围 val range = 2 。然后,我正在寻找一种方法来输出以下结果:result = List(List(1,2,3), List(4,5,6), List(7,8,9), List(10)) 。这意味着如果 range = 0那么同一组中只有相同的数字。

目前我使用以下方法

val minVal = l.min
val range1 = (minVal + range).toDouble
val groups = l.foldLeft(Map[Int, List[Int]]())((result, num) => {
val numRange = math.ceil(num / range1).toInt
if (result.contains(numRange)) {
result.updated(numRange, num :: result(numRange))
} else {
result.updated(numRange, List(num))
}
})
groups.keys.toList.sortBy(k => k).map(groups(_))

它在大多数情况下都有效,除非 range = 0slowestNum != 1 。例如。列表 val l = List(2,3,4,5,6,7,8,9,10)范围 val range = 2 ,结果是List(List(2), List(4, 3), List(6, 5), List(8, 7), List(10, 9)) .

所以我想知道是否还有其他方法可以解决这个问题。

最佳答案

为什么要复杂化?

def coll(l: List[Int], range: Int): List[List[Int]] =
if (l.isEmpty) Nil else {
val (b, a) = l.span((l.head - range to l.head + range).contains)
b :: coll(a, range)
}

因此,该算法将数字收集到一个组中,直到数字在正/负范围内。

val list = List(7,4,1,9,10,20,50,52,30)
coll(list, 3)
res6: List[List[Int]] = List(List(7, 4), List(1), List(9, 10), List(20), List(50, 52), List(30))

如果您希望每个组单独排序,请调用 res6.map(_.sorted)

关于scala - 根据从最小数字开始的范围将数字列表分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28010260/

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