删除一些数据作为groupBy的一部分

时间:2016-08-23 19:23:06

标签: scala

此代码:

import scala.collection.immutable.Set;

object Update extends App {

  val ss: List[Set[(String, String)]] = List(Set(
    ("sentance1", "url1"),
    ("sentance2", "url1"),
    ("sentance3", "url2")
  ));

  val linesWithUrl: List[Map[String, Set[(String, String)]]] = ss.map(m => m.groupBy(_._2))

  linesWithUrl.foreach(println)
}

返回:

  Map(url1 -> Set((sentance1,url1), (sentance2,url1)), url2 -> Set((sentance3,url2)))

我想只将句子作为地图中的值返回:

  Map(url1 -> Set((sentance1), (sentance2)), url2 -> Set((sentance3)))

方法I考虑的是迭代linesWithUrl并创建一个只有所需值的地图,但是可以用另一种方式创建预期的数据结构吗?

1 个答案:

答案 0 :(得分:1)

无法想到任何其他选择。我相信你提出的建议 - 事后映射 - 是正确的方法:

ss.map(m => m.groupBy(_._2).mapValues(_.map(_._1)))

我不是说这是一种规则,但我个人通常会寻求最简单,最明显的解决方案,除非存在性能问题。以任何其他方式执行此操作可能会使之后尝试理解您的代码的任何人都变得更加困难。

编辑:作为与风格相关的旁注,我现在注意到您使用了m => m.groupBy。如果您喜欢这样,也可以将我的_.map更改为s => s.map(一致性是一件好事:)。虽然这对元组来说可能是不必要的。