Scala последовательность групп по enum исчерпывающе - PullRequest
1 голос
/ 06 ноября 2019

Я хочу исчерпывающе сгруппировать последовательность по enum, что означает, что если последовательность содержит 0 вхождений enum, все равно включите ее в группировку.

Например, если у меня есть перечисление типа

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)
)

Как я могу сгруппировать furnitures по Color, как у меня:

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 не отображается как группа.

1 Ответ

2 голосов
/ 06 ноября 2019

Вы можете просмотреть все цвета и проверить, содержит ли карта, созданная 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)))
...