scala - 如何按 Scala 中元素列表的各个元素进行分组
问题描述
如果我没有用它们的实际名称命名事物,请原谅我,我刚刚开始学习 Scala。我已经环顾四周,但找不到我的问题的明确答案。
假设我有一个对象列表,每个对象都有两个字段:x: Int
和l: List[String]
,在我的例子中,字符串代表类别。
列表可以是任意长度,因此l
一个对象可以属于多个类别。此外,各种对象可以属于同一类别。我的目标是按各个类别对对象进行分组,其中类别是键。这意味着如果一个对象链接到“N”个类别,它将出现在“N”个键值对中。
到目前为止,我设法通过以下方式对类别列表进行分组:
objectList.groupBy(x => x.l)
但是,这显然是按类别列表而不是按类别对对象进行分组。
我正在尝试通过避免循环等的不可变集合来做到这一点。
如果有人有一些想法,将不胜感激!谢谢
编辑:通过请求实际案例类和我正在尝试的内容。
case class Car(make: String, model: String, fuelCapacity: Option[Int], category:Option[List[String]])
再一次,汽车可以属于多个类别。比方说List("SUV", "offroad", "family")
。
我想按category
元素而不是整个类别列表进行分组,并将其fuelCapacity
作为值,以便能够fuelCapacity
在其他指标中提取每个类别的平均值。
解决方案
像下面这样的东西?
objectList // Seq[YourType]
.flatMap(o => o.l.map(c => c -> o)) // Seq[(String, YourType)]
.groupBy { case (c,_) => c } // Map[String,Seq[(String,YourType)]]
.mapValues { items => c -> items.map { case (_, o) => o } } // Map[String, Seq[YourType]]
(特意“重磅”来帮你理解背后的思路)
编辑,或从 Scala 2.13 开始,感谢groupMap
:
objectList // Seq[YourType]
.flatMap(o => o.l.map(c => c -> o)) // Seq[(String, YourType)]
.groupMap { case (c,_) => c } { case (_, o) => o } // Map[String,Seq[YourType]]
推荐阅读
- angular - 打开其他垫子手风琴时如何关闭垫子手风琴?
- javascript - TypeError:无法读取未定义 [VueJs] 的属性“推送”
- c++ - Cmake链接外部库
- html - 响应式导航栏不会“拉伸”
- sql - 在多个条件的同一查询中使用 min 和 max 查找唯一记录
- algorithm - 具有不同标签的两个文本之间的关系
- c# - 在 ASP.NET Core MVC 中使用 REST 而不是数据库
- java - HackerEarth 练习时间不多了
- python - Django 从目录中读取文件并将它们的名称保存在数据库中
- ios - Unable to find app by keyword in AppStore