2016-08-23 46 views
1

这部分代码:删除一些数据作为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并创建一个只有所需值的映射,但是可以创建预期的数据结构另一种方式?

回答

1

想不出别的办法。我相信你提出什么 - 映射在它之后 - 是正确的方式做到这一点:

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

我并不是说这是某种规则的,但我个人平时努力是最简单,最解决方案除非存在性能问题,否则显而易见。以任何其他方式进行这样做可能会让任何试图了解您的代码的人变得更加困难。

编辑:作为一个风格相关的边注,我注意到现在你使用m => m.groupBy。如果您喜欢这种方式,请将_.map更改为s => s.map(一致性是件好事:))。尽管可能不需要元组。