You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 20:39:03