Есть ли в мире Java карта с переменной длиной ключа? - PullRequest
6 голосов
/ 16 января 2012

Мне нужна карта, но когда я вызываю get (key, n), она должна возвращать не только все записи с искомым значением ключа, но также и все, где n последних значащих битов ключа совпадают с поискомключ (например, применяя что-то вроде ключа & (1 << (n + 1) -1)). </p>

Есть ли что-то подобное, уже реализованное в Java?

Ответы [ 2 ]

10 голосов
/ 16 января 2012

Не совсем, но вы можете использовать NavigableMap.subMap для реализации этого. например,

NavigableMap<Integer, Value> map =
int keyBase = key & ~((1 << n)-1);
Map<Integer, Value> subMap = map.subMap(keyBase, true, keyBase + (1 << n), false);

Если вы хотите осуществлять поиск по младшим, а не по старшим битам, вы должны обратить биты перед добавлением и поиском. Это сгруппирует младший бит, второй младший бит, затем третий младший бит и т. Д.

2 голосов
/ 16 января 2012

HashMap не собирается этого делать, но TreeMap может.

Вам необходимо нормализовать и сторнировать ваши ключи (то есть решить, сколько бит вы хотели бы сохранить, и сторнировать биты, чтобы сделатьменее значимые биты, которые будут вашими самыми значимыми).Затем вы можете убрать менее значимые биты (ранее наиболее значимые биты) из ваших ключей и использовать поиск по диапазону древовидной карты, чтобы найти свой ответ.

...