首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Scala into列表分组为不同的间隔?

将Scala into列表分组为不同的间隔?
EN

Stack Overflow用户
提问于 2013-06-05 06:58:32
回答 2查看 1.1K关注 0票数 2

我不确定groupBytakeWhilegrouped是否能实现我想做的事情。我需要开发一个函数,它可以根据我想要指定的间隔自动对数字列表进行分组。用例是获取年龄列表,并将其分类为动态年龄类别(如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))

我在谷歌上搜索了一个小时,但什么也没找到。谢谢你的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-05 07:04:04

您将需要groupBy

代码语言:javascript
复制
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方法,使其显示为索引序列,其中某些条目为空:

代码语言:javascript
复制
val ys = xs.groupBy(_ / 100) withDefaultValue Nil
ys(0)  // List(99)
ys(4)  // List() !
票数 4
EN

Stack Overflow用户

发布于 2013-06-05 07:38:47

这是一种为其中的值生成范围和过滤器的方法。不过,我认为l.groupBy(_ / 100).values更可取。

代码语言:javascript
复制
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),这提供了:

代码语言:javascript
复制
List[List[Int]] = List(List(99), List(103, 101, 111), List(206, 211, 234, 242))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16928852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档