Не усложняйте свою жизнь.
Предполагая, что 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();
}