扩展组

时间:2015-04-13 19:26:19

标签: scala scala-collections

我有一个对象集合,每个对象都有一个列表,让我们说:

case class Article(text: String, labels: List[String])

我需要构建一个地图,这样每个键对应一个标签,其相关值是具有此标签的文章列表。

我希望以下示例能让我的目标更清晰。我想转换以下列表

List(
  Article("article1", List("label1", "label2")),
  Article("article2", List("label2", "label3"))
)

进入Map[String,List[Article]]

Map(
  "label1" -> List(Article("article1", ...)),
  "label2" -> List(Article("article1", ...), Article("article2", ...)),
  "label3" -> List(Article("article2", ...))
)

是否有一种优雅的方式来执行此转换? (我的意思是使用收集方法而不需要直接使用可变集合)

1 个答案:

答案 0 :(得分:2)

这个怎么样?

val ls = List(
  Article("article1", List("label1", "label2")),
  Article("article2", List("label2", "label3"))
)

val m = ls
    .flatMap{case a @ Article(t,ls) => ls.map(_ -> a)}
    .groupBy(_._1)
    .mapValues(_.map(_._2))

m.foreach(println)
// (label2,List(Article(article1,List(label1, label2)), Article(article2,List(label2, label3))))
// (label1,List(Article(article1,List(label1, label2))))
// (label3,List(Article(article2,List(label2, label3))))