获取Scala枚举中值的上一个和下一个元素

时间:2014-03-27 00:39:58

标签: scala enumeration

我想向Scala Enumeration添加两个新操作,以便在给定特定值(如果存在)的情况下获取上一个和下一个值。例如,我想写一些类似的东西:

object Nums extends MyNewEnumerationType {
  type Nums = Value
  val One,Two,Three = Value
}

Nums.nextOf(One) // Some(Two)
Nums.prevOf(One) // None

我的想法是创建一个新类并以这种方式添加方法:

class PrevNextEnum extends Enumeration {

  val prevOf = values.zip(None +: values.map{_.some}.toSeq).toMap
  val nextOf = {
    if (values.isEmpty) Map.empty
    else values.zip(values.tail.map{_.some}.toSeq :+ None).toMap
  }

}

问题是这不起作用,因为初始化prevOfnextOf时,values为空。

第一个问题:为什么values为空,何时填充了值?

第二个问题:我如何实施prevOfnextOf

第三个问题:是否可以将方法prevOfnextOf添加到值类型而不是枚举?写One.next感觉比写Num.nextOf(One)

更自然

2 个答案:

答案 0 :(得分:1)

尝试以下代码:

class PrevNextEnum extends Enumeration {

 lazy val prevOf = {
   val list = values.toList
   val map = list.tail.zip(list.map(Some(_))).toMap + (list.head -> None)
   map
 }
 lazy val nextOf = {
  val list = values.toList
  val map = (list.zip(list.tail.map(Some(_)) :+ None).toMap)
  map
 }
}

object Nums extends PrevNextEnum {
 type Nums = Value
 val One, Two, Three = Value
}

object App extends App {
  println(Nums.prevOf(Nums.Two))
  println(Nums.nextOf(Nums.One))
  println(Nums.nextOf(Nums.Three))
  println(Nums.prevOf(Nums.One))
}

答案 1 :(得分:1)

基于user1484819的答案:

class PrevNextEnum extends Enumeration {

  lazy val prevOf = {
    val list = values.toList
    val map = list.tail.zip(list).toMap
    v:Value => map.get(v)
  }
  lazy val nextOf = {
    val list = values.toList
    val map = list.zip(list.tail).toMap
    v:Value => map.get(v)
  }
}

object Nums extends PrevNextEnum {
  type Nums = Value
  val One, Two, Three = Value
}

这具有基本相同的结构,但使用Map在使用Options而不是get时可以返回apply的事实。