微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

scala – 根据最小数字的范围将数字组分组

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

例如,我有一个列表val l = List(1,2,3,4,5,6,7,8,9,10)和范围val range = 2.然后,我正在寻找一种方法输出以下结果:result = List(List(1,3),List(4,6),List(7,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 = 0和slowestNum!= 1.对于列表val l = List(2,10)和范围val range = 2,结果是List(List(2),列表(6,5),列表(8,7),列表(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,1,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).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐