список каждый раз, когда он не нужен, а под ним оптимизируется с помощью
ли простое и эффективное решение для определения верхних n элементов Итерации Scala? Я имею в виду что-то вроде
iter.toList.sortBy(_.myAttr).take(2)
но без необходимости сортировки всех элементов, когда интерес представляют только два верхних элемента. В идеале я ищу что-то вроде
iter.top(2, _.myAttr)
см. также: Решение для верхнего элемента с использованием Ordering:В Scala, как использовать Ordering [T] с List.min или List.max и обеспечить читабельность кода
Обновить:Спасибо всем за ваши решения. Наконец, я взял оригинальное решениенеизвестный пользователь и принял это использоватьIterable
исутенер-мой-библиотека шаблон:
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))