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

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

发布时间:2020-12-16 18:20:48 所属栏目:安全 来源:网络整理
导读:假设有数字列表和范围值,我想将它们分组,其中每组中的项目在最低数字的范围内,并对它们进行排序. 例如,我有一个列表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
假设有数字列表和范围值,我想将它们分组,其中每组中的项目在最低数字的范围内,并对它们进行排序.

例如,我有一个列表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).

(编辑:李大同)

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

    推荐文章
      热点阅读