0

528 ビットのバイナリ データを保持するハッシュ マップを作成する必要があります。バイナリデータはハッシュマップにどのように格納されますか?

例: 0000000001000000100000000... これは 25 ビットです。同様に、528 ビットを格納する必要があります。

この値を何らかのバイト配列に変換する必要がありますか、それともデータをメモリに直接保存できますか?

例は非常に役立ちます。

4

2 に答える 2

2

この値をバイト配列に変換する必要がありますか?

バイト配列は 1 つのオプションです。その他には、short、int、long、または (おそらく)Bitsetクラスのインスタンスの配列が含まれます。どちらが最適かは、「レコード」オブジェクトがどのように作成され、アプリケーションがそれらをどのように処理するかによって異なります。

表現型を決定したら、レコードを値として持つハッシュ テーブルを作成するのは簡単です。例えば

HashMap<SomeKey, Record> map = new HashMap<SomeKey, Record>();
map.put(someKey, record); 
...

または直接データをメモリに保存できますか?

Javaではそれができません。

于 2011-03-20T15:21:22.947 に答える
1

あなたの人生を複雑にしないでください。

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();
}
于 2011-03-20T17:01:29.920 に答える