2013-03-14 4 views
1

Есть ли менее запутанный способ найти предшественника и преемника перечислимого значения?Предшественник и преемник значения перечисления в Scala

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

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; Ответ Райана уже охватывает это.

+0

@RichardSitze - 'maxId' является эксклюзивным, а не инклюзивным. Попробуйте - это работает так, как написано. (Я мог бы использовать '==' вместо '> =' и '<=' соответственно.) (И для бонусных очков: если вы догадались, что есть ошибка, связанная с этим с «Value (Int.MaxValue)», вы 'd be right.) –

+0

@RichardSitze - Нет. Попробуйте. 'maxId' неверно названо; его следует называть 'nIds', потому что, как я уже сказал, _it является исключительной границей. То есть у вас есть 'id' to _but not including_ 'maxId'. –

+0

Получил это. ти. Неверное имя и ошибочные документы. –

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] и не E.Value хотя. Это будет работать правильно, хотя, если вы назовете succ (E.Z).

+0

Просто понял, что ваш вопрос задал вопрос о предшественнике. –

+0

Модифицировано для включения пред. Я верю, что есть лучшие ответы, особенно когда речь заходит о пред. –

Смежные вопросы