在Scala中创建使用枚举作为键的Map的语法是什么?

时间:2012-07-11 20:00:43

标签: scala

请参阅以下代码。 Eclipse将此行标记为不正确:

var map = Map[MyEnum,Point]()

我正在尝试使用scala等效于Java:

private enum Letters{ A,B,C}
private Map<Letters,Integer> thing= new HashMap<Letters,Integer> ();

这是写入它的文件/上下文。

class Point(var x:Int = 0, var y:Int = 0, var hasBeenSet:Boolean = false){

}

object MyEnum extends Enumeration{
    MyEnum = Value
    val UL,U,UR,L,R,DL,D,DR = Value
}

object MyEnumHolder {
  var map = Map[MyEnum,Point]()
  MyEnum.values.foreach(x => (map + (x -> new Point()) ) 
}

我正在尝试初始化地图的一个实例,枚举的每个值都映射到一个空点(这就是每个循环中发生的事情)。

编辑:不得不编辑,因为我搞砸了编辑粘贴代码的一些事情,但它现在应该有效了

4 个答案:

答案 0 :(得分:14)

var map = Map[MyEnum.Value, Point]()

或者我更喜欢

import MyEnum._
var map = Map[MyEnum,Point]()

编辑:为了解释这意味着什么,在枚举Value中是类型和方法的名称。 type MyEnum = Value基本上只是声明Value类型的别名,下一行val UL, U... = Value正在调用生成枚举的方法,每个枚举都有MyEnum.Value类型。因此,在声明地图时,您必须引用此类型以便键存储枚举。您也可以使用MyEnum.MyEnum,但首先声明类型别名的原因是您可以将其导入范围,并且能够像MyEnum一样引用它。

答案 1 :(得分:2)

您没有将MyEnums放在地图中,而是MyEnum

var map = Map[MyEnum.Value, Point]()

答案 2 :(得分:2)

object MyEnum extends Enumeration {
  type MyEnum = Value /* You were missing keyword "type" here */
  val UL,U,UR,L,R,DL,D,DR = Value
}

object MyEnumHolder {
  import MyEnum.MyEnum /* Import this, otherwise type MyEnum can't be found */

  var map = Map[MyEnum, String]()
  MyEnum.values.foreach(x => (map + (x -> x.toString)))
}

您可能还想查看Case classes vs Enumerations in Scala

答案 3 :(得分:1)

我让它与以下工作。我承认,语法有点不稳定。

object MyEnum extends Enumeration {
    type MyEnum = Value
    val UL, U, UR, L, R, DL, D, DR = Value
}

object Main extends App {
    Map[MyEnum.MyEnum, String]()

}

虽然我猜它可以帮助多元化

object Diaries extends Enumeration {
    type Diary = Value
    val Steven, Jessica, Bob = Value
}

import Diaries._

val currentDiary = Steven

val interestingDiaries = List[Diary](Steven, Jessica)

所以这里的日记是日记列表,而日记是列表中的特定日记。