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)番目の値を取得し、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ライアンの答えはすでにこれをカバーしています。

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

ただし、これはE.ValueではなくOption[E.Value]も返します。これは、succ(EZ)を呼び出す場合にも正しく機能します。

于 2013-03-14T18:31:22.643 に答える