質問

少しベクトルを持つ整数のセットを表す方法を探しています(これは、その整数のセットの特徴的な関数です)。

当初、ScalaのBitsetが理想的な候補者になると思いました。ただし、Bitsetはドキュメントに従ってシフト操作をサポートしていないようです 1. 。さらに調査すると、関連するJavaビットセットの実装もシフト操作をサポートしていないこともわかりました。 2.

Shift操作をサポートする独自のBitsetクラスを実装する唯一のオプションが残っていますか?さらに、説明された説明によると 3 ScalaのBitset実装でのシフト操作をサポートするのは難しいことではないように聞こえませんか、またはここで何かを誤解していますか?

前もって感謝します。

役に立ちましたか?

解決

新しい機能を改造する必要性に直面したときの通常のトリックは、「Pimp My Library」パターンです。追加の操作を実行することを目的とした専用タイプにビットセットを暗黙的に変換します。

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, 、次に、生の基礎となるアレイにアクセスするための(わずかにハッキーな)アプローチは、パターンマッチです。不変のためのコンクリートのサブクラスは3つしかないので、あまり痛くありません 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")
}

迷惑なことに、 elems1 パラメーション BitSet2 ヴァルではありません elems 可変ビットセットへのパラマは保護されています。したがって、それは完璧ではありませんが、セットが自明で不変の場合はトリックを行う必要があります。些細な場合、セットへの「通常の」アクセスはそれほど高価ではありません。

そして、はい、この手法は上記のようにラッパー内で使用されます。

他のヒント

たとえば、4つのポジションに左にシフトするために、マップを使用できます。

import collection.immutable.BitSet
val bitSet = BitSet(1,2,3)
bitSet map (_ + 4)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top