删除groupBy中的一些数据



代码:

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

我正在考虑的方法是迭代linesWithUrl并创建一个仅包含所需值的映射,但是可以用另一种方式创建预期的数据结构吗?

想不出别的办法。我相信你的建议——事后映射——是正确的做法:

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

我并不是说这是某种规则,但就我个人而言,除非存在性能问题,否则我通常会争取最简单和最明显的解决方案。如果用其他方法,可能会让那些试图理解你代码的人更加困难。

编辑:作为一个风格相关的边注,我现在注意到你使用m => m.groupBy。如果这是你喜欢的,也把我的_.map改成s => s.map(一致性是一件伟大的事情:))。但对于元组来说,这可能是不必要的。

最新更新