我不确定groupBy
,takeWhile
或grouped
是否会实现我想要做的事情。我需要开发一个函数,根据我想指定的间隔自动分组数字列表。用例是列出年龄列表并将其分类为动态年龄类别(如1-5,5-10等)。它需要是动态的,因为用户可能想要更改间隔。
例如,我有一个数字列表:List(103, 206, 101, 111, 211, 234, 242, 99)
我可以按10
或100
间隔。然后输入100
的结果为:List(List(99),List(101,103,111),List(206,211,234,242))
。
我在过去一小时内搜索了Google和SO,但找不到任何内容。谢谢你的帮助!
答案 0 :(得分:4)
您需要groupBy
:
val xs = List(103, 206, 101, 111, 211, 234, 242, 99)
xs.groupBy(_ / 100)
// Map(0 -> List(99), 1 -> List(103, 101, 111), ...)
grouped
只是创建给定大小的后续块,而不是查看实际元素。只要谓词成立,takeWhile
就会获取前导元素。
您可以在结果地图上使用withDefaultValue
方法使其显示为索引序列,其中某些条目为空:
val ys = xs.groupBy(_ / 100) withDefaultValue Nil
ys(0) // List(99)
ys(4) // List() !
答案 1 :(得分:1)
这是一种为其中的值生成范围和过滤器的方法。我认为l.groupBy(_ / 100).values
更可取。
val interval = 100
//This gives List(Vector(0, 100), Vector(100, 200), Vector(200, 300))
val intervals = 0 until l.max + interval by interval sliding(2)
for(interval <- intervals;
within <- List(l.filter(x => x > interval(0) && x <= interval(1)))
) yield within
使用val l = List(103, 206, 101, 111, 211, 234, 242, 99)
,这会给出:
List[List[Int]] = List(List(99), List(103, 101, 111), List(206, 211, 234, 242))