2016-03-30 20 views
3

私のアプリケーションでBitSetを使用していて、BitSetのすべての使用ビットがtrueに設定されているかどうかを確認したいと思います。今、すべてのビットがfalseに設定されているかどうかをチェックする方法isEmpty()がわかりましたが、肯定的なケースを見つけることができません。私はsomeBitSet.cardinality() == someBitSet.size()のようなことをすることができることを知っていますが、これは不器用なようです。私は何かを逃しているのですか、あるいはそのような方法が実装されていないという明白な理由はありますか?BitSetのすべてのビットがtrueに設定されていることを確認してください

答えて

6

「すべてのビットがBitSet」のようなものはありません。なぜなら、これまで設定された最大ビットより大きなビットをいつでも設定できるからです。 BitSetを最大10個の値に保持したいとします。したがって、10ビットを設定し、それらのすべてが真であるかどうかをチェックしたいと思います。しかし、BitSetは、あなたが10ビットしか持っていないことを知りません。もしあなたがもっとあれば?次回はbitSet.set(10000)に電話をかけると動作します(BitSetは自動的にサイズ変更されます)。

一般的なケースでは、bitSet.size()はそれほど役に立たないことに注意してください。消費されるメモリについてです。現在の実装は常に64の倍数であるため、異なる州が10つしかない場合、someBitSet.cardinality() == someBitSet.size()は常にfalseを返します。 BitSetnew BitSet(10)で作成した場合でもコンストラクタパラメータは、(ArrayListのような)望ましい初期容量にすぎません。パフォーマンスヒントとしてのみ使用されます。

パフォーマンスの観点から最適なソリューションをmyLengthあなたは(あなたが自分でそれを維持する必要があります)BitSetに格納する値の最大数ですnextClearBit(0) >= myLengthをチェックすることです。結果がfalseの場合は、cardinality()より速く動作します。

+0

しかし、ドキュメントには:_aビットセットに現在のサイズがあります。これは現在ビットセットによって使用されているスペースのビット数です。そのため、簡単に確認できれば便利だと思いましたそれらのすべてが真実に設定されたかどうか。編集:さて、今すぐあなたの編集を見た。ありがとう。それでは、ここで私のデータ構造が選択されていないかもしれないと思います。 – conipo

+0

@ジョナサン、実際に64,128,192などのビットが必要な場合は動作します。他の初期サイズは自動的に64の次の倍数に拡張されます(実装の詳細ですが、それに頼ることはできません)。 –

+1

['BitSet.length()'](https://docs.oracle.com/javase/8/docs/api/java/util/BitSet.html#length--)が見つからないようです: "*返品このBitSetの「論理サイズ」:BitSetの最高セットビットのインデックスに「size()」とは対照的に、まさに望ましいものです。ですから、あなたが望む操作は 'bs.length()== bs.nextClearBit(0)'です。これはうまく動作し、 'cardinality()'ベースの解決法よりも効率的ですが、まだ不器用です。 – Holger

関連する問題