2011-01-28 5 views
2

次のCコードは何にも列挙型から効率的な「マップ」として列挙型と配列を使用しています。Scalaのキーとしてcaseクラスを使った効率的なマップですか?

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


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

はスカラ座でこれは可能ですか?
I.大文字小文字クラスから何かに "マップ"を持って、効率的な配列として実装され、ツリーやハッシュマップとして実装されません。しかし、私はIntではなく、特定の種類の索引のみで索引を付けることができるようにしたいと考えています。

更新:要するに、スカラ配列に何らかの種類のenum(caseクラスまたはEnumeration)をインデックスに追加したいと思います。

+0

私は専門用語で混乱していると思います。あなたは配列が欲しいですが、intではなくenumによってインデックスが付けられていますか? – Synesso

+1

配列は常に整数でインデックス付けされます。それがオブジェクトによってインデックスされているなら、それはある種のハッシュテーブルです。 –

+0

@サイネオ:そうです。私は質問を更新しました。 –

答えて

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)) 
+0

ここで 'abstract class Color'と' case object ColorX'を書くことができます。また、配列アクセスの戻り値が宣言と一致しません。 – Raphael

+0

色の定義を修正しました。私はあなたの2番目の発言をあまり得ていない。 – Landei

+0

申し訳ありませんが、私の悪い。実行時に 'Color'のいくつのケースが存在するかを知る方法はありますか?次に、配列のサイズをハードコードする必要があります。あなたはJavaのenumでこれを行うことができます。 – Raphael

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) 

+0

これは配列の検索と同じくらい有効ですか? –

+0

デフォルトのMap実装は、かなり高速な検索を提供するハッシュマップです。 – Landei

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 &のメソッドと同じようにパフォーマンスが悪いのと同じように危険です。しかし、それは非常に危険です。

関連する問題