| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Двойной ключ в HashMap |
| Автор: Opik 12.2.2007, 15:24 | ||
| Как осуществить субж? Например
Что мне нужно: Возможность выдернуть юзера по ИД и по Сессии, будут какие предложения? А то я уже совсем запутался... |
| Автор: LSD 12.2.2007, 15:33 |
| Используй MultiKey из Jakarta Commons Collections. |
| Автор: chief39 12.2.2007, 16:47 |
| Гм, а сделать свой Key объект, который состоит из инта и стринга? Определив hashcode, equals() |
| Автор: y3u 12.2.2007, 17:15 |
| И по сессии И по айдишнику - тогда можно просто сделать свой объектик, как и сказал chief39, а вот если ИЛИ по сессии ИЛИ по айдишнику, тогда не знаю, видимо, ка сказал LSD ... Тоже гляну на это мультикей ПыСЫ в любом случае кто мешает при добавлении пихать в два хэшмапа, а при поиске пользоваться нужным |
| Автор: Opik 12.2.2007, 23:42 |
| y3u, Нужно ИЛИ по сессии, ИЛИ по айди. Multikey не подходит, т.к там сразу по обоим критериям. Насчет двух хешмапов думал, но подумал, что есть более правильное решение. |
| Автор: LSD 13.2.2007, 11:52 | ||
Так И или ИЛИ? Если ИЛИ, то можно и одной HashMap обойтись.
Но будет геморой с удалением значений. Например мы хотим удалить запись по ID, но нужно также будет найти его сессию, чтобы удалить и ее. |
| Автор: y3u 13.2.2007, 13:17 |
а вот и нельзя |
| Автор: LSD 13.2.2007, 14:23 | ||
И какое это имеет отношение, к тому что я сказал? |
| Автор: LSD 13.2.2007, 15:50 | ||||
Вообще то, я прелагал искать value или по id, или по name И хеш код value в данном случае вообще неважен. Добавлено @ 16:04
Я знаю как работает HashMap. Совпадение хешей маловероятно, но не смертельно, в реальных задачах они все равно совпадают. |
| Автор: sergejzr 13.2.2007, 16:05 | ||||
Почему они вдруг разные? И там и там указатель на один и тот же обьект. Пишешь что-то вроде:
Добавлено @ 16:06
"Медленность" зависит от соотношения размера таблицы к количеству элементов в ней. Тут Ява сама подберёт оптимальную величину. |
| Автор: y3u 13.2.2007, 16:22 |
| да блин, я описАлся, я имел в виду, конечно, name, а не value... Я вообще только о ключх говорю и все |
| Автор: sergejzr 13.2.2007, 16:29 |
Не больше, чем совпадение двух разных name. Не верно. С увеличением количества пользователей наша таблица будет расширятся и уменьшать таким образом вероятность совпадений. (Размер кстати можно и изначально побольше задать) Для практически равномерного распределения размер таблицы должен быть примерно N+20% где N - количество элементов хранимых таблице. Что это за объекты - не важно Нет, но книги разных авторов за разное время спокойно стоят на одной полке. И name и id - то и другое для хэштаблицы - объекты с калькулируемым идентификатором. |
| Автор: Opik 27.2.2007, 23:24 | ||||||||
Написал класс, по совету chief39,
Добавляю в HashMap так:
Как мне бонально проверить на наличие сессии?
не помогает
аналогично |
| Автор: nornad 28.2.2007, 02:05 | ||||
При такой реализации DoubleKey - никак. Точнее, никак за счёт containsKey. Простой перебор множества ключей сработает, но это простой перебор. В качестве заплатки сработает, если будешь пихать в мапу "пустышку" именно для возможности поиска по сессии:
Искать тогда так:
null вместо идентификатора пихать нельзя, т.к. будет падать на NullPointer. |
| Автор: Opik 28.2.2007, 11:15 |
| nornad, Если делать put - 0, тогда смысл во всей это байде отпадает совсем. |
| Автор: LSD 28.2.2007, 12:34 |
А, никак Единственный нормальный выход в данной ситуации - это 2 Map-а. |
| Автор: nornad 28.2.2007, 17:35 |
А ты не думал, что ты хочешь слишком уж много? Тебе требуется, чтобы мапа различала ключи с разными id и session при вставке, и НЕ различала их по id при поиске ключа в мапе. Так не бывает. Это сродни тому, чтобы определить, есть ли в мапе по интам чётные ключи. Надо - перебери мапу или добавляй свои "пустышки". Не нужна такая "байда" - не ломай голову. |
| Автор: LSD 28.2.2007, 19:02 |
Вернее даже одним можно обойтись |
| Автор: Opik 28.2.2007, 19:03 |
| LSD, Коим образом? |
| Автор: LSD 1.3.2007, 15:07 | ||
Да очень просто:
Единственная проблема это метод remove() но тут уж ничего не поделаешь, кроме как завести еще один Map для установки соответствия id и session. |
| Автор: Opik 1.3.2007, 15:16 |
| LSD, В этом случае все равно лучше уже 2 мапа. Впрочем остановился на 2-ух, пофиг |
| Автор: LSD 1.3.2007, 15:23 |
| Значит считаем вопрос решенным? |
| Автор: Opik 1.3.2007, 15:24 |
| Угу, уже пометил |
| Автор: nornad 1.3.2007, 18:16 |
Не совсем верно, потому что если у тебя будет два одинаковых идентификатора в разных сессиях или два разных идентификатора для одной сессии, то в мапе произойдёт наложение. В общем, мапа будет хранить не совсем то, что хочется. |
| Автор: LSD 1.3.2007, 18:23 | ||
Вообще-то идентификатор должен быть уникальным, иначе никакого поиска по нему не может быть. А два одинаковых идентификатора для одной и той же сессии, это хотя и очень странное решение, но работать будет. |
| Автор: nornad 1.3.2007, 22:15 | ||
Видимо, ты этого не заметил. ;) |
| Автор: LSD 2.3.2007, 12:46 |
Видимо ты не заметил Если ид или сессия не уникальны, то как ты предлагашь по ним искать? |
| Автор: nornad 2.3.2007, 18:32 |
| Да, действительно не заметил этого. В памяти держалась лишь первоначальная задача - уникальность по двойному ключу, а в мапе надо было проверить, нет ли ключей с конкретной сессией. |