我试图为一个序列实现一个distinctOn函数,该函数将采用一个函数f并返回一个序列,当f应用于它时,每个项目都有一个不同的结果。 EG:Scala:Seq.distinctOn函数的实现
case class Person(name:String, age:Int)
val people = Seq(Person("Al", 20), Person("Bob", 21),
Person("Bob", 24)).distinctOn(_.name)
//people should be:
Seq(Person("Al", 20), Person("Bob", 21))
其中第一个副本(Al)的返回和订单被保留。我当前的实现包含一个var,而我使用Sets和GroupBy的其他尝试并未保持顺序。有没有更好的方式来实现这个没有var?为了记录我目前的尝试是:
def distinctOn[A](f: T => A):Seq[T]={
var seen = Set[A]()
seq.foldLeft(Seq[T]()) { (res, curr) => {
if(!seen.contains(f(curr))){
seen = seen ++ Set[A](f(curr))
res ++ Seq(curr)
}else{
res
}
}}
}
为什么不尝试使用'groupBy'方式类似: 'people.groupBy(_名).MAP(_._ 2(0))' – RyuuGan 2012-04-13 08:55:35
@RyuuGan,我认为这将不保留命令。 – 2012-04-13 09:18:12
@RyuuGan,Paul是正确的,groupBy不保存顺序。 – ChucK 2012-04-16 07:30:16