是否有一个简单而有效的解决方案来确定Scala Iterable的前n个元素?我的意思是
iter.toList.sortBy(_.myAttr).take(2)
Run Code Online (Sandbox Code Playgroud)
但是当只有前2名感兴趣时,无需对所有元素进行排序.理想情况下,我正在寻找类似的东西
iter.top(2, _.myAttr)
Run Code Online (Sandbox Code Playgroud)
另请参阅:使用Ordering的顶部元素的解决方案:在Scala中,如何使用List.min或List.max订购[T]并保持代码可读
谢谢大家的解决方案.最后,我采用了用户未知的原始解决方案并使用它Iterable和pimp-my-library模式:
implicit def iterExt[A](iter: Iterable[A]) = new {
def top[B](n: Int, f: A => B)(implicit ord: Ordering[B]): List[A] = {
def updateSofar (sofar: List [A], el: A): List [A] = {
//println (el + " - " + sofar)
if (ord.compare(f(el), f(sofar.head)) > 0)
(el :: sofar.tail).sortBy (f)
else sofar
}
val (sofar, rest) = iter.splitAt(n)
(sofar.toList.sortBy (f) /: rest) (updateSofar (_, _)).reverse
}
} …Run Code Online (Sandbox Code Playgroud)