Эффективная карта с классом дел в качестве ключа в Scala? - PullRequest
4 голосов
/ 28 января 2011

Следующий код C использует enum и массив как эффективную "карту" из enum во что-либо:

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


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

Возможно ли это с помощью Scala?
Т.е. иметь "карту" из класса case вчто-то, реализованное как эффективный массив, а не как дерево или как hashmap.Тем не менее, я хотел бы иметь возможность индексировать только с определенным типом, а не с Int.

Обновление: Короче говоря, я бы хотел, чтобы Scala Array индексировался с помощью некоторого вида enum (case case или Enumeration).

Ответы [ 3 ]

3 голосов
/ 28 января 2011

Для небольших перечислений вы можете "смоделировать" поведение 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

Однако я сомневаюсь, что это будет считаться хорошим стилем, особенно потому что это небезопасно.Использование карты - лучший подход, или вы можете заключить массив в специализированную структуру данных, которая имеет дело со значениями цвета:

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 голосов
/ 28 января 2011
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 голос
/ 28 января 2011

Если вам нужна полная производительность 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 &, так же, как и производительность.Это, однако, очень небезопасно.

...