找到枚举值的前身和后继者是否有一种不太复杂的方式?
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
答案 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),这也可以正常工作。