当面临需要改进新功能的情况时,通常的方法是使用“Pimp My Library”模式。将BitSet隐式转换为专门执行添加操作的类型:
class ShiftableBitSet(bs: BitSet) {
def shiftLeft(n: Int): BitSet = ... //impl goes here
}
implicit def bitsetIsShiftable(bs: BitSet) = new ShiftableBitSet(bs)
val sample = BitSet(1,2,3,5,7,9)
val shifted = sample.shiftLeft(2)
将shiftLeft
更改为您喜欢的名称,并使用您喜欢的参数。
更新
如果您确定您有一个不可变的BitSet
,则可以通过模式匹配轻松访问原始底层数组。这也不算太痛苦,因为不可变的BitSet
只有三个可能的具体子类:
import collection.immutable.BitSet
val bitSet = BitSet(1,2,3)
bitSet match {
case bs: BitSet.BitSet1 => Array(bs.elems)
case bs: BitSet.BitSetN => bs.elems
case _ => error("unusable BitSet")
}
BitSet2
,elems1
参数不是可变的,而对于可变的BitSet
,elems
参数被标记为受保护状态。因此这并不完美,但如果您的集合是非平凡且不可变的,应该可以解决问题。对于简单情况,“正常”访问集合的代价不会太高。
是的,如上所述,这种技术将在包装器内部使用。
你可以使用 map 函数,例如将左移 4 个位置:
import collection.immutable.BitSet
val bitSet = BitSet(1,2,3)
bitSet map (_ + 4)
BitSet
来避免不必要的对象创建,但正如你所提到的,这个技巧只适用于不可变的BitSet
。顺便说一下,在最后一段中,我认为你想说的是BitSet
而不是BitMap
,对吗? - Asiri Rathnayake