首页 > 解决方案 > 在 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 )

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

有什么建议么?

标签: scalaplayframeworkscala-collections

解决方案


如果您想从 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)

推荐阅读