получение объекта с уважением максимального значения поля в Scala Seq - PullRequest
0 голосов
/ 10 сентября 2018

Cycle - это объект, у которого есть поле с именем cycleNumber, в отношении которого я хочу получить объект Cycle с максимальным номером cycNumber.Чтобы сделать это, я пытаюсь:

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.

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018
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 - его номер цикла (0, если нет)
  2. получить кортеж с максимальным номером цикла
  3. вернуть первый элемент этого кортежа (._1) или выполнить цикл самого себя
0 голосов
/ 10 сентября 2018

Если вы хотите получить максимальное значение из Seq, вы можете использовать sortBy, maxBy, уменьшить или сложить

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)
...