0

我需要创建一个包含 528 位二进制数据的哈希映射。二进制数据如何存储在哈希图中?

示例:0000000001000000100000000... 这是 25 位。同样,我需要存储 528 位。

我是否需要将此值转换为某个字节数组,还是可以直接将数据存储在内存中?

一个例子会有很大帮助。

4

2 回答 2

2

我需要将此值转换为某个字节数组吗?

字节数组是一种选择。其他包括 short、int 或 long 的数组,或者(可能)Bitset类的实例。哪一个最好取决于如何创建“记录”对象以及您的应用程序如何处理它们。

一旦你决定了表示类型,创建一个以记录为值的哈希表就很简单了;例如

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

或者直接我可以将数据存储在内存中?

你不能在 Java 中做到这一点。

于 2011-03-20T15:21:22.947 回答
1

不要让你的生活复杂化。

假设valueString类型,那么如果你:

存储keyString

可能是最简单和最易读的。

    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

存储keybyte[]

我个人想避免这种情况。在这种情况下,简单的默认散列函数将对数组的引用作为键散列,但我们想要深度散列(所有元素必须相等)。以下将无法按描述工作:

    HashMap<byte[], String> map = new HashMap<byte[], String>();
    map.put(new BigInteger(key1, 2).toByteArray(), value);

一种方法fix是将数组放入调用的类或扩展集合中ArrayList,然后重写 equals 和 hash 方法。它并不像看起来那么简单——你真的需要知道你在做什么。

存储keyBitSet

提取、添加或操作位并不是最有效的——它甚至相当慢。因此,如果它非常明显地影响内存大小并且这是一个问题,这似乎只是一个不错的选择。

    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 回答