1

要素ごとに 1 つ以上のオブジェクト参照をパックする Java で列挙値のシーケンスをエンコードする方法を探しています。ファンタジーコードでは:

List<MyEnum> list = new EnumList<MyEnum>(MyEnum.class);

原則として、要素ごとのビット数を使用して各要素をエンコードできる必要があります。これに対する既存の実装、またはそれを行う簡単な方法はありますか?log2(MyEnum.values().length)

単純なラッパー クラスを使用してList<MyEnum>.

私は一般的な既存の解決策を好みますが、貧しい人の解決策として、long の配列を使用し、できるだけ多くの要素を各 long に基数エンコードするだけです。5 つの列挙値を使用すると、27 個の要素が long に収まり、1.3 ビットしか無駄にしません。これはかなり良いことです。

注: セットの実装を探しているわけではありません。それはシーケンスを保持しません。

4

2 に答える 2

2

ビットを int に格納できます (32 ビット、32 個の「スイッチ」)。しかし、運動値は別として、ポイントは何ですか?-あなたは本当に非常に少量のメモリについて話しているのです. より良い質問は、なぜ enum 参照で数バイトを節約したいのですか? プログラムの他の部分は、より多くのメモリを使用している可能性があります。

データを効率的に転送することに関心がある場合は、列挙型をそのままにして、カスタムのシリアル化を使用することを検討できますが、これも努力する価値がある珍しい状況です。

于 2012-11-10T03:14:30.837 に答える
2

通常、1 つのオブジェクト参照は 1 つの 32 ビットまたは 64 ビット ワードを占有します。それよりもうまくやるには、列挙型の値を 32 ビット未満の数値に変換し、それらを配列に保持する必要があります。

数値への変換は、 を呼び出すのと同じくらい簡単getOrdinal()です。そこから、次のことができます。

  • byteまたはにキャストしshort、シーケンスを byte / short 値の配列として表すか、または
  • 値の配列に対して適切な圧縮アルゴリズムを使用しintます。

もちろん、これらはすべて、コードをより複雑にするという代償を伴います。たとえば、コレクション API を利用することはできず、独自のシーケンス管理を行う必要があります。非常に大きなシーケンスまたは膨大な数のシーケンスを処理する必要がない限り、これが価値があるとは思えません。


原則として、log2(MyEnum.values().length)ビットを使用して各要素をエンコードできる必要があります。

実際、シーケンスを圧縮することにより、それよりもうまくいく可能性があります。冗長性がどれだけあるかによって異なります。

于 2012-11-10T03:17:32.627 に答える