528 ビットのバイナリ データを保持するハッシュ マップを作成する必要があります。バイナリデータはハッシュマップにどのように格納されますか?
例: 0000000001000000100000000... これは 25 ビットです。同様に、528 ビットを格納する必要があります。
この値を何らかのバイト配列に変換する必要がありますか、それともデータをメモリに直接保存できますか?
例は非常に役立ちます。
この値をバイト配列に変換する必要がありますか?
バイト配列は 1 つのオプションです。その他には、short、int、long、または (おそらく)Bitset
クラスのインスタンスの配列が含まれます。どちらが最適かは、「レコード」オブジェクトがどのように作成され、アプリケーションがそれらをどのように処理するかによって異なります。
表現型を決定したら、レコードを値として持つハッシュ テーブルを作成するのは簡単です。例えば
HashMap<SomeKey, Record> map = new HashMap<SomeKey, Record>();
map.put(someKey, record);
...
または直接データをメモリに保存できますか?
Javaではそれができません。
あなたの人生を複雑にしないでください。
value
が型であると仮定すると、次のString
場合:
key
として保存String
おそらく最も簡単で読みやすい。
String value = "some data", key = "0101101010101010101011010110101010010101";
HashMap<String, String> map = new java.util.HashMap<String, String>();
map.put(key, value);
追加:byte[]
タイプのキーを
に変換するには、クラスString
を使用できます。次に例を示します。BigInteger
byte[] keyb = { 90, -86, -83, 106, -107 };
String keys = new BigInteger(keyb).toString(2);
要素keys
の値は次のとおりです: 101101010101010101011010110101010010101
.
key
として保存byte[]
個人的にはこれは避けたいです。この場合の単純なデフォルトのハッシュ関数は、配列への参照をキーとしてハッシュしますが、ディープ ハッシュが必要です (すべての要素が等しい必要があります)。以下は説明どおりに機能しません。
HashMap<byte[], String> map = new HashMap<byte[], String>();
map.put(new BigInteger(key1, 2).toByteArray(), value);
これを行う 1 つの方法fix
は、配列をクラスに配置するか、呼び出されたコレクションを拡張してArrayList
、equals および hash メソッドを書き直すことです。それは見かけほど些細なことではありません。自分が何をしているのかを本当に知る必要があります。
key
として保存BitSet
ビットの抽出、追加、または操作は最も効率的ではありません。むしろ遅いです。したがって、これは、メモリ サイズに非常に顕著な影響を与え、それが問題になる場合にのみ、適切なオプションと思われます。
String value = "some data", key = "0101101010101010101011010110101010010101";
HashMap<BitSet, String> map = new HashMap<BitSet, String>();
map.put(getBitSet(key), value);
BitSet
次のようなその場しのぎのクラスコンバーターを作成できます。
public static int keySize = 41;
public static BitSet getBitSet(String key) {
char[] cs = new StringBuilder(key).reverse().toString().toCharArray();
BitSet result = new BitSet(keySize);
int m = Math.min(keySize, cs.length);
for (int i = 0; i < m; i++)
if (cs[i] == '1') result.set(i);
return result;
}
public static String getBitSet(BitSet key) {
StringBuilder sb = new StringBuilder();
int m = Math.min(keySize, key.size());
for (int i = 0; i < m; i++)
sb.append(key.get(i) ? '1' : '0');
return sb.reverse().toString();
}