2

我不确定是groupBy, takeWhile, 还是grouped是否会实现我想做的事情。我需要开发一个函数,根据我要指定的间隔自动对数字列表进行分组。用例是获取年龄列表并将它们分类为动态年龄类别(如 1-5、5-10 等)。它需要是动态的,因为用户可能想要更改间隔。

例如,我有数字列表:List(103, 206, 101, 111, 211, 234, 242, 99)

我可以间隔10100。那么输入的结果100将是:List(List(99),List(101,103,111),List(206,211,234,242))

我在最后一个小时搜索了 Google 和 SO,但找不到任何东西。谢谢您的帮助!

4

2 回答 2

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() !
于 2013-06-04T23:04:03.993 回答
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))
于 2013-06-04T23:38:46.727 回答