在 Scala Seq 中获取具有字段最大值方面的对象

obtaining an object with the max value respect of a field in a Scala Seq

Cycle 是一个对象,它有一个名为 cycleNumber 的字段,我想获取具有最大 cycleNumber 的 Cycle 对象。为此,我正在尝试:

def maxCycle(xs: Seq[Cycle]): Cycle = xs match {
  /*this means xs CAN NOT BE EMPTY*/
    case Seq(x: Cycle) => x
    case x :: y :: rest => maxCycle( (if (x.cycleNumber.getOrElse(0) > y.cycleNumber.getOrElse(0)) x else y ) :: rest )

但是,我遇到了匹配错误,我相信这是对最新命令的尊重,因为各自的 table 有 2 行用于 Cycle 对象。

有什么建议吗?

如果你想从一个 Seq 中获取最大值,你可以使用 sortBy、maxBy、reduce 或 fold

case class Cycle(cycleNumber:Option[Int])
val cycles = Seq(Cycle(Option(4)), Cycle(Option(1)), Cycle(Option(8)), Cycle(Option(8)))

// sortBy + lastOption because max fails if seq is empty
val max = cycles.sortBy(_.cycleNumber).lastOption

// reduceOption if seq is empty
vao max2 = cycles.reduceOption { (a, b) => if(a.cycleNumber.getOrElse(0) > b.cycleNumber.getOrElse(0)) a else b }

// or if seq is not empty
val max3 = cycles.maxBy(_.cycleNumber)
def maxCycle(xs: Seq[Cycle]): Cycle = {
    xs.map(a => (a, a.cycleNumber.getOrElse(0))).maxBy(_._2)._1
}

一个简单的实现:

  1. 将 Seq[Cycle] 转换为 Seq[(Cycle, Int)] 每个元组的 ._1 是循环本身,._2 是它的循环编号(如果 None 则为 0)
  2. 获取循环数最大的元组
  3. return 该元组的第一个元素 (._1) 或循环自身