使用案例类作为Scala中的关键字的高效地图?
下面的C代码使用枚举和数组作为有效的“映射”从枚举到任何东西:
enum Color { ColorRed, ColorGreen, ColorBlue, ColorSize};
void f() {
int x[ColorSize];
x[ColorRed] = 12;
x[ColorGreen] = 33;
x[ColorBlue] = 4;
return x[ColorGreen];
}
这可能与斯卡拉?
即有一个从案例类到某些东西的“映射”,实现为有效数组而不是树或散列表。 然而,我希望能够仅以一种特殊类型而不是Int来进行索引。
更新:总之,我想有一些枚举(案例类或枚举)索引的Scala数组。
对于小枚举,您可以“模拟”C行为:
abstract sealed class Color(val index: Int)
object Color {
implicit def col2int(color:Color) = color.index
}
case object ColorRed extends Color(0)
case object ColorGreen extends Color(1)
case object ColorBlue extends Color(2)
...
import Color._
val array = Array(1,2,3)
array(ColorRed) = 12
但是,我怀疑这会被认为是不错的风格,尤其是因为它不安全。 使用地图是一种更好的方法,或者您可以将数组封装在处理Color指标的专用数据结构中:
class ColorArray[T:ClassManifest] {
val array = new Array[T] (3)
def apply(color: Color) = array(color.index)
def update(color: Color, value: T) = array(color.index) = value
}
...
val cArray = new ColorArray[Int]()
cArray(ColorRed) = 12
println(cArray(ColorRed))
object Color extends Enumeration{ val ColorRed, ColorGreen, ColorBlue = Value } import Color._ def f:Map[Color.Value,Int] = Map(ColorRed -> 12 , ColorGreen -> 33, ColorBlue -> 4)
如果你想要完整的C性能,你可以这样做:
trait CEnum {
private var size = 0;
def value = { size += 1; size-1 }
}
object Color extends CEnum {
val colorRed = value
val colorGreen = value
val colorBlue = value
val colorSize = 3
}
import Color._
def f() = {
val x = Array[Int](colorSize)
x(colorRed) = 12
x(colorGreen) = 33
x(colorBlue) = 4
x(colorGreen)
}
与C&C中的方法一样,它也同样不安全。 然而,这是非常不安全的。
链接地址: http://www.djcxy.com/p/68265.html上一篇: Efficient map with case class as a key in Scala?
下一篇: What is the difference between Scala's case class and class?