我試圖爲一個序列實現一個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