バイナリで528ビットレコードを保持するハッシュマップを作成する方法
質問
528ビットのバイナリデータを保持するハッシュマップを作成する必要があります。ハッシュマップにバイナリデータはどのように保存されますか?
例:00000001000000100000000 ...これは25ビットです。同様に、528ビットを保存する必要があります。
この値をバイト配列に変換する必要がありますか、それともデータをメモリに直接保存できますか?
例は非常に役立ちます。
解決
あなたの人生を複雑にしないでください。
仮定します value
ofです 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
等しい方法とハッシュメソッドを書き直します。それは見た目ほど些細なことではありません - あなたは本当に自分が何をしているのかを知る必要があります。
店 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();
}
他のヒント
この値をバイト配列に変換する必要がありますか?
バイト配列は1つのオプションです。その他には、短い、intまたはlong、または(おそらく)インスタンスの配列が含まれます。 Bitset
クラス。どちらが最適かは、「レコード」オブジェクトの作成方法と、アプリケーションがどのように処理するかに依存します。
表現タイプを決定したら、値が単純であるため、レコードのあるハッシュテーブルを作成します。例えば
HashMap<SomeKey, Record> map = new HashMap<SomeKey, Record>();
map.put(someKey, record);
...
または、直接データをメモリに保存できますか?
Javaではできません。