Я пытаюсь реализовать функцию 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' метод так: ' (. _ Имя) .map people.groupBy (_._ 2 (0)) ' – RyuuGan
@RyuuGan, я думаю, что не будет сохранять приказ. –
@RyuuGan, Пол прав, groupBy не сохраняет заказ. – ChucK