我需要创建一个包含 528 位二进制数据的哈希映射。二进制数据如何存储在哈希图中?
示例:0000000001000000100000000... 这是 25 位。同样,我需要存储 528 位。
我是否需要将此值转换为某个字节数组,还是可以直接将数据存储在内存中?
一个例子会有很大帮助。
我需要将此值转换为某个字节数组吗?
字节数组是一种选择。其他包括 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);
一种方法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();
}