处理 Set of Sets 并返回一个平面 Iterable
val input=Set(Set("a","b"),Set("b","c"))
我想要这个:
Map("a"->1,"b"->2,"c"->1)
实现此类功能的最佳功能方法是什么? 在嵌套的 Iterables 中使用yield关键字会产生结果:
output = for(firstlevel<-input) yield for(item<-firstlevel) yield item
val input=Set(Set("a","b"),Set("b","c"))
I want this:
Map("a"->1,"b"->2,"c"->1)
What is the best functional approach for implementing such functionality?
Using yield keyword results in nested Iterables:
output = for(firstlevel<-input) yield for(item<-firstlevel) yield item
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
更新: 合并了使用
input.toSeq.flatten
的建议
而不是
input.toSeq flatMap { _.toSeq }
转换为单个值序列...
...匹配...的组值
...并计数
update: incorporated the suggestion to use
input.toSeq.flatten
instead of
input.toSeq flatMap { _.toSeq }
convert to a single sequence of values...
...group values that match...
...and count
如果你想使用 for-compression 和 yield:
最后一行中的代码可以简化(但不是您想要的):
If you want to use for-comprehension and yield:
The code in your last line can be simplified (but does not what you want):
哦,天哪,那太丑了...
[编辑]
Collection-API 确实需要一种“合并”两个地图的方法(或者我只是忽略了它???),例如
有了这个你就可以写一些类似的东西:
[Edit2]
根据 Kevin 的想法,合并可以写成
看起来我的 Scala-Fu 仍然太弱了。最好的表达方式是什么
?
Oh boy, that's so ugly...
[Edit]
The Collection-API needs really a method for "merging" two Maps (or did I just overlook it???), e.g.
With this you could write something like:
[Edit2]
With Kevin's idea merge could be written as
Seems like my Scala-Fu is still too weak. What's the best way to express
?