详尽枚举的 Scala 序列组

Scala sequence group by enum exhaustively

我想通过枚举对序列进行详尽分组,这意味着如果序列包含 0 次出现的枚举,无论如何都将其包含在分组中。

例如,如果我有一个像

这样的枚举
object Color extends Enumeration {
  type Color = Value
  val Red, Green, Blue = Value
}

一个使用枚举的对象

case class Furniture (
  name: String,
  color: Color.Value
)

对象列表

val furnitures = Seq(
  Furniture("Chair", Color.Red), 
  Furniture("Table", Color.Red),
  Furniture("Bed", Color.Blue),
  Furniture("Sofa", Color.Blue)
)

如何按 Colorfurnitures 进行分组,例如:

Map(
  Color.Red -> List(Furniture("Chair", Color.Red), Furniture("Table", Color.Red)),
  Color.Green -> List(),
  Color.Blue -> List(Furniture("Bed", Color.Blue), Furniture("Sofa", Color.Blue))
)

使用 Seq.groupBy 方法,Color.Green 未显示为一组。

您可以查看所有颜色并检查 groupBy 创建的地图是否包含任何列表,如果不包含则添加默认的空列表:

val grouped = furnitures.groupBy(_.color)
val result = Color.values.map(c => (c, grouped.getOrElse(c, Nil))).toMap

println(result) 
//Map(Red -> List(Furniture(Chair,Red), Furniture(Table,Red)), Green -> List(), Blue -> List(Furniture(Bed,Blue), Furniture(Sofa,Blue)))