假设有数字列表和范围值,我想将它们分组,其中每组中的项目在最低数字的范围内,并对它们进行排序.
例如,我有一个列表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))