2011-01-28 43 views
2

甲下面的C代碼使用枚舉和數組作爲高效「地圖」從枚舉到任何東西:在Scala中將案例類作爲關鍵字的高效地圖?

enum Color { ColorRed, ColorGreen, ColorBlue, ColorSize}; 


void f() { 
    int x[ColorSize]; 
    x[ColorRed] = 12; 
    x[ColorGreen] = 33; 
    x[ColorBlue] = 4; 
    return x[ColorGreen]; 
} 

這可能與Scala呢?
I.e.有一個從案例類到某些東西的「映射」,實現爲高效的數組而不是樹或散列表。然而,我希望能夠僅以一種特殊類型而不是Int來進行索引。

更新:總之,我想有一些枚舉(案例類或枚舉)索引的Scala數組。

+0

我想我很困惑的術語。你想要一個數組,但是通過枚舉而不是int索引的數組? – Synesso 2011-01-28 06:30:50

+1

數組總是以整數索引。如果它被對象索引,那麼它就是某種散列表。 – 2011-01-28 06:40:26

+0

@Synesso:你說得對。我更新了這個問題。 – 2011-01-28 06:44:17

回答

3

對於小枚舉可以「模擬」的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 

不過,我懷疑這會被認爲是良好的作風,特別是因爲它是不安全的。使用地圖是一個更好的辦法,或者你可以在一個專門的數據結構與顏色indizes涉及包裝的數組:

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)) 
3
 
object Color extends Enumeration{ 
    val ColorRed, ColorGreen, ColorBlue = Value 
} 

import Color._ 
def f:Map[Color.Value,Int] = 
    Map(ColorRed -> 12 , ColorGreen -> 33, ColorBlue -> 4) 

1

如果你想完整的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 &中的方法一樣,它也同樣不安全。然而,這是非常不安全的。