在scala中划分元组序列
我经常编写相同的代码来划分元组序列:在scala中划分元组序列,scala,Scala,我经常编写相同的代码来划分元组序列: def groupBy[A, B](s: Seq[(A, B)]) : Map[A, Seq[B]] = s.groupBy (_._1) map { case (k, values) => (k, values.map(_._2))} 有更好的方法吗?ScalazfoldMap更清晰,但效率可能更低: import scalaz._, Scalaz._ def groupBy[A, B](l: List[(A,B)]) = l foldMap {
def groupBy[A, B](s: Seq[(A, B)]) : Map[A, Seq[B]] = s.groupBy (_._1) map { case (k, values) => (k, values.map(_._2))}
有更好的方法吗?Scalaz
foldMap
更清晰,但效率可能更低:
import scalaz._, Scalaz._
def groupBy[A, B](l: List[(A,B)]) = l foldMap {t => Map(t._1 → List(t._2))}
由于Scalaz仅为具体类型(如List
或Vector
)提供类型类实例,因此只能使用这些实例,而不能使用Seq
。如果需要通用版本,可以显式使用typeclass:
def groupBy[S[_]: Foldable, A, B](s: S[(A, B)]) =
s foldMap {t => Map(t._1 → List(t._2))}
这将适用于
列表
、向量
,或者通常适用于任何可折叠的S[]:但仍然不适用于您不知道具体类型的Seq
。您的groupBy
签名非常具体,因此标准库中没有一种方法可以做到这一点。看起来很简洁?稍微简洁一点:groupBy(u._1).mapValues(u.map(u._1))
,但随后您遇到了mapValues的问题