如何创建将以二进制形式保存528位记录的hashmap

时间:2011-03-20 14:59:05

标签: java hashmap bitset

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

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

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

一个例子会有很大的帮助。

2 个答案:

答案 0 :(得分:2)

  

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

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

一旦确定了表示类型,创建一个记录为值的哈希表很简单; e.g。

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

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

你不能用Java做到这一点。

答案 1 :(得分: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);

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();
}