سؤال

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

نصائح أخرى

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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top