How to create hashmap which will hold 528 bit record in binary
I need to create a hash map which will hold 528 bit binary data. How would the binary data be stored in the hashmap?
Example: 0000000001000000100000000... this is 25 bits. 开发者_如何学JAVASimilarly, I need to store 528 bits.
Do I need to convert this value into some byte array, or can I directly store the data in memory?
An example would be of great help.
Do i need to convert this value into some Byte array ?
A byte array is one option. Others include arrays of short, int or long, or (possibly) instances of the Bitset
class. Which one is best depends on how the "record" objects are created and how your application processes them.
Once you've decided on the representation type,creating a hash table with the record as values is simple; e.g.
HashMap<SomeKey, Record> map = new HashMap<SomeKey, Record>();
map.put(someKey, record);
...
or directly I can store the data in memory?
You can't do that in Java.
Do not complicate your life.
Assuming value
is of String
type, then if you:
Store key
as String
Probably easiest and most readable.
String value = "some data", key = "0101101010101010101011010110101010010101";
HashMap<String, String> map = new java.util.HashMap<String, String>();
map.put(key, value);
Additional:
To convert a key of type byte[]
to String
, you can use BigInteger
class, for example:
byte[] keyb = { 90, -86, -83, 106, -107 };
String keys = new BigInteger(keyb).toString(2);
Element keys
will have a value: 101101010101010101011010110101010010101
.
Store key
as byte[]
Personally I would like to avoid this. Simple default hash function in this case hashes the reference to the array as key, but we want deep hash (all elements must be equal). Following will not work as described:
HashMap<byte[], String> map = new HashMap<byte[], String>();
map.put(new BigInteger(key1, 2).toByteArray(), value);
One way to fix
this, is to put the array in the class or extend collection called ArrayList
and rewrite the equals and hash method. It is not as trivial as it seems - you really need to know what you are doing.
Store key
as BitSet
Extracting, adding or manipulating bits is not most efficient - it's even rather slow. So this seems only good option if it impacts the memory size very noticeably and that's a problem.
String value = "some data", key = "0101101010101010101011010110101010010101";
HashMap<BitSet, String> map = new HashMap<BitSet, String>();
map.put(getBitSet(key), value);
You can create a makeshift BitSet
class converter like:
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();
}
精彩评论