Scala中Enumeration值的前置和后继

时间:2013-03-14 18:10:16

标签: scala enums enumeration

找到枚举值的前身和后继者是否有一种不太复杂的方式?

object E extends Enumeration {
   val W, X, Y, Z = Value
}

def succ(a: E.Value) : E.Value = {
   val arr = E.values.toArray
   return arr(a.id + 1)
}


scala> succ(E.W)
res17: E.Value = X

scala> succ(E.Y)
res18: E.Value = Z

2 个答案:

答案 0 :(得分:2)

E(n)将获得n值,每个值都知道自己的索引(字段id)。因此,假设您刚刚按顺序保留了值:

def succ(a: E.Value) = if (a.id+1 >= E.maxId) None else Some(E(a.id+1))
def pred(a: E.Value) = if (a.id <= 0) None else Some(E(a.id-1))

如果您在超出范围时抛出异常,则可以删除检查和选项。或者,如果您愿意,可以循环回到开头。

如果您可能根据自己的喜好重新编号(例如val V = Value(98)),那么您必须搜索values集;瑞恩的答案已经涵盖了这一点。

答案 1 :(得分:1)

您可以执行以下操作:

scala> def succ(a: E.Value) = {
 |   E.values.find(_ > a)
 | }
succ: (a: E.Value)Option[E.Value]

scala> succ(E.W)
res14: Option[E.Value] = Some(X)

scala> succ(E.Z)
res15: Option[E.Value] = None

scala> def pred(a: E.Value) = {
 |   E.values.takeWhile(_ < a).lastOption
 | }
pred: (a: E.Value)Option[E.Value]

scala> pred(E.W)
res26: Option[E.Value] = None

scala> pred(E.Y)
res27: Option[E.Value] = Some(X)

这也会返回Option [E.Value]而不是E.Value。如果你打电话给succ(E.Z),这也可以正常工作。