相关疑难解决方法(0)

获取Scala Iterable的前n个元素的最简单方法

是否有一个简单而有效的解决方案来确定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]并保持代码可读

更新:

谢谢大家的解决方案.最后,我采用了用户未知的原始解决方案并使用它Iterablepimp-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)

algorithm scala

37
推荐指数
3
解决办法
2万
查看次数

标签 统计

algorithm ×1

scala ×1