Существует ли простое и эффективное решение для определения верхних n элементов Scala Iterable? Я имею в виду что-то вроде
iter.toList.sortBy(_.myAttr).take(2)
но без сортировки всех элементов, когда интересны только верхние 2. В идеале я ищу что-то вроде
iter.top(2, _.myAttr)
см. также: Решение для верхнего элемента с помощью Ordering: В Scala, как использовать Ordering [T] с List.min или List.max и сохранить прочитанный код
Обновление:
Спасибо всем за ваши решения. Наконец, я взял оригинальное решение неизвестного пользователя и принял его для использования 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
}
}
case class A(s: String, i: Int)
val li = List (4, 3, 6, 7, 1, 2, 9, 5).map(i => A(i.toString(), i))
println(li.top(3, _.i))