Scala如何将含嵌套分类列表属性的Info对象列表按单分类分组
解决方案
实现思路
- 你之前的
groupBy逻辑是将整个categories列表作为分组键,自然只有分类完全一致的对象才会被分到同一组,无法满足多分类独立分组的需求 - 正确的实现逻辑是先把每个
Info对象按其归属的分类展开为多个(分类, Info)二元组,再按分类键分组,即可实现同一对象归属多个分类时,在所有对应分组中都存在的效果
代码实现
Scala 2.13+ 版本
使用自带的groupMap方法简化写法:
// 定义你的Info类示例 case class Info(name: String, categories: Option[List[String]]) val bigList: List[Info] = List( Info("Info1", Some(List("category1", "category2"))), Info("Info2", Some(List("category1"))), Info("Info3", Some(List("category2", "category3"))), Info("Info4", None) ) val sortedMap: Map[String, List[Info]] = bigList .flatMap(info => info.categories.getOrElse(Nil).map(cat => (cat, info)) ) .groupMap(_._1)(_._2) // 转成你需要的List[(分类, 归属对象列表)]格式 val sortedList = sortedMap.toList
兼容低版本Scala(2.12及更早)
如果使用的Scala版本不支持groupMap,可以替换为groupBy+mapValues实现:
val sortedMap: Map[String, List[Info]] = bigList .flatMap(info => info.categories.getOrElse(Nil).map(cat => (cat, info)) ) .groupBy(_._1) .mapValues(_.map(_._2)) .toMap val sortedList = sortedMap.toList
可选:无分类对象处理
如果需要把categories为None或者空列表的对象分到统一的默认分组,可以调整flatMap逻辑:
val sortedMap = bigList .flatMap(info => info.categories match { // 空分类或无分类统一归入「未分类」分组 case Some(Nil) | None => List(("未分类", info)) case Some(cats) => cats.map(cat => (cat, info)) } ) .groupMap(_._1)(_._2)
内容的提问来源于stack exchange,提问作者jeb2
相关产品推荐
相关产品推荐

