2013-06-04 29 views
2

我不确定是否groupBy,takeWhilegrouped会达到我想要的效果。我需要开发一个函数,根据我想指定的时间间隔自动对数字列表进行分组。这个用例正在获取一个年龄列表,并将它们分类为动态年龄类别(如1-5,5-10等)。它需要是动态的,因为用户可能想要更改间隔。将Scala Ints列表分组到不同的时间间隔?

例如,我有号码的列表: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搜索了最后一个小时,但找不到任何东西。谢谢您的帮助!

回答

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() ! 
+0

感谢啊。看起来我只是误解了“groupBy”的用法。干杯! – crockpotveggies

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))