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