如果你需要做的比较是应用程序的其他地方,你可以提取Ordering
到Player
的同伴对象:
Welcome to Scala version 2.11.7 (OpenJDK 64-Bit Server VM, Java 1.8.0_66-internal).
Type in expressions to have them evaluated.
Type :help for more information.
scala> :paste
// Entering paste mode (ctrl-D to finish)
case class Player(lastDice: Int)
object Player {
implicit val ordering: Ordering[Player] = Ordering.by(_.lastDice)
}
val players = List(Player(2), Player(2))
players.max == players.min
// Exiting paste mode, now interpreting.
defined class Player
defined object Player
players: List[Player] = List(Player(2), Player(2))
res0: Boolean = true
附录:
另一个要考虑的是列表的大小。如果列表为空max
和min
会抛出异常:
def min[B >: A](implicit cmp: Ordering[B]): A = {
if (isEmpty)
throw new UnsupportedOperationException("empty.min")
reduceLeft((x, y) => if (cmp.lteq(x, y)) x else y)
}
def max[B >: A](implicit cmp: Ordering[B]): A = {
if (isEmpty)
throw new UnsupportedOperationException("empty.max")
reduceLeft((x, y) => if (cmp.gteq(x, y)) x else y)
}
如果列表中只有一名球员,你的逻辑将错误地给你None
。要将所有这些考虑在内,最简单的事情可能是使用排序列表。
scala> :paste
// Entering paste mode (ctrl-D to finish)
case class Player(lastDice: Int)
object Player {
implicit val orderingDescending: Ordering[Player] =
Ordering.fromLessThan(_.lastDice > _.lastDice)
def nextPlayer(players: List[Player]): Option[Player] = {
val sorted = players.sorted
sorted match {
case first :: Nil => Some(first)
case first :: second :: _ if first.lastDice != second.lastDice => Some(first)
case _ => None
}
}
}
// Exiting paste mode, now interpreting.
defined class Player
defined object Player
scala> Player.nextPlayer(List[Player]())
res2: Option[Player] = None
scala> Player.nextPlayer(List(Player(1)))
res3: Option[Player] = Some(Player(1))
scala> Player.nextPlayer(List(Player(1), Player(4)))
res5: Option[Player] = Some(Player(4))
scala> Player.nextPlayer(List(Player(1), Player(4), Player(4)))
res6: Option[Player] = None
scala> Player.nextPlayer(List(Player(1), Player(1), Player(4)))
res7: Option[Player] = Some(Player(4))
注意:您必须更改顺序为降序。
换句话说,你设法找到2名球员,其中一个最小的'LastDice'值,另一个是最大的。如果这两个玩家是同一个玩家,则返回'None',否则返回最大的LastDice值。我的理解是否正确? – Haspemulator
是的,这是正确的。抱歉不清楚问题。 – Pavel