2012-11-17 8 views
11

In Java haben wir zwei nette Klassen: EnumSet für Sätze von enum s und EnumMap für eine Karte, deren Schlüssel sind enum s. EnumSet wird als ein 64-Bit-Wort (oder ein Array von 64-Bit-Wörtern) und EnumMap als ein Array von Werten dargestellt, die beide durch die Ordnungszahlen von enum s indiziert sind. So fügen Sie ein/suchen/entfernen/... Operationen nur O (1) Zeit.Gibt es eine Scala-Entsprechung von EnumSet/EnumMap?

Haben wir sowas in Scala - veränderlich oder unveränderlich?

Ich fand BitSet (sowohl veränderlich und unveränderlich), die auf Ganzzahlen arbeitet, so nahm ich an, dass es eine effiziente Implementierung von Sets von Enumeration geben würde. Value s davon gesichert. Aber ich habe nur Enumeration.ValueSet gefunden, was backed up by SortedSet[Int] ist. Obwohl das nicht so schlecht ist, scheint BitSet für diesen Zweck ziemlich effizient zu sein.

Ich habe keine optimierte Implementierung von Karten mit Enumeration.Value als Schlüssel ähnlich wie EnumMap gefunden.

+1

Im Gegensatz zu Java 'enum's, Scala' Enumeration' Werte können beliebige numerische Kennungen haben und deshalb habe ich vermute, dass es keine direkte Entsprechung für Java 'EnumSet' ist und' EnumMap' in Scala. – ghik

+0

@ghik Während das stimmt, würde ich sagen, dass diese Funktion nur selten verwendet wird. Und wenn jemand großen Zahlen Werte zuweisen würde, wäre es seine Verantwortung, einfach eine andere "Set"/"Map" Implementierung zu verwenden. –

+0

@ghik Tatsächlich ist das eine Fehlerquelle in 2.10 impl. –

Antwort

5

Eigentlich in 2.10 Enumeration.ValueSet verwendet BitSet.

class ValueSet private[ValueSet] (private[this] var nnIds: immutable.BitSet)

That would be here.

+4

Gibt es auch ein EnumMap-Äquivalent? –