関数fを取り、fが適用されたときに各アイテムの結果が異なるシーケンスを返すシーケンスに対して、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
}
}}
}