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). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |