1

是否有一种不那么复杂的方法来查找枚举值的前任和后继?

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
4

2 回答 2

2

E(n)将获得第nth 值,并且每个值都知道自己的索引(字段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集合;瑞安的回答已经涵盖了这一点。

于 2013-03-14T18:43:22.530 回答
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(EZ),这也将正常工作。

于 2013-03-14T18:31:22.643 回答