代码:
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
(一致性是一件伟大的事情:))。但对于元组来说,这可能是不必要的。