【问题标题】:What is the syntax for creating a Map in Scala that uses an enum as a key?在 Scala 中创建使用枚举作为键的 Map 的语法是什么?
【发布时间】:2012-07-11 20:00:42
【问题描述】:

请看下面的代码。此行被 Eclipse 标记为不正确:

var map = Map[MyEnum,Point]()

我正在尝试做相当于 Java 的 scala:

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()) ) 
}

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

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

【问题讨论】:

  • 我想你是想写type MyEnum = Value
  • 你是对的,我在编辑中修复了它;)谢谢!
  • 顺便说一句:Enumeration 被打破了,超出了希望。不要使用它,除非你讨厌自己和你的开发者伙伴。
  • 顺便说一句:如果你想在 Java 映射中使用enums 作为键,你应该使用EnumMap

标签: scala


【解决方案1】:
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 一样引用它。

【讨论】:

  • 成功了!谢谢!我不明白 .Value 的含义,虽然我认为是我的问题,但必须查一下。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:
    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

    【讨论】:

      【解决方案4】:

      我让它与以下内容一起工作。语法有点不靠谱,我承认。

      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)
      

      所以这里的Diaries就是Diary的列表,Diary是列表中特定的日记。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-22
        • 1970-01-01
        • 2021-12-13
        • 1970-01-01
        相关资源
        最近更新 更多