我正在尝试为一个序列实现一个 distinctOn 函数,该函数将采用一个函数 f 并返回一个序列,当 f 应用于它时,每个项目都有一个不同的结果。例如:
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
}
}}
}