Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Двойной ключ в HashMap 
V
    Опции темы
Opik
Дата 12.2.2007, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



Как осуществить субж?
Например
Код

HashMap<Integer,String,User> t = new HashMap<Integer,String,User>();

Что мне нужно:
Возможность выдернуть юзера по ИД и по Сессии, будут какие предложения? А то я уже совсем запутался...
PM MAIL Skype   Вверх
LSD
Дата 12.2.2007, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Используй MultiKey из Jakarta Commons Collections.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
chief39
Дата 12.2.2007, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


карманная тигра
***


Профиль
Группа: Участник Клуба
Сообщений: 1631
Регистрация: 20.5.2005
Где: Киев

Репутация: 15
Всего: 77



Гм, а сделать свой Key объект, который состоит из инта и стринга?
Определив hashcode, equals() 


--------------------
Люди - это свечи. Они либо горят, либо их - в жопу!(с)

PM MAIL   Вверх
y3u
Дата 12.2.2007, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 9.9.2006
Где: Москва

Репутация: 5
Всего: 13



И по сессии И по айдишнику - тогда можно просто сделать свой объектик, как и сказал chief39, а вот если ИЛИ по сессии ИЛИ по айдишнику, тогда не знаю, видимо, ка сказал LSD ... Тоже гляну на это мультикей

ПыСЫ
в любом случае кто мешает при добавлении пихать в два хэшмапа, а при поиске пользоваться нужным

Это сообщение отредактировал(а) y3u - 12.2.2007, 17:16


--------------------
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах
PM MAIL   Вверх
Opik
Дата 12.2.2007, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



y3u, 
Нужно ИЛИ по сессии, ИЛИ по айди.
Multikey не подходит, т.к  там сразу по обоим критериям.
Насчет двух  хешмапов думал, но подумал, что есть более правильное решение.
PM MAIL Skype   Вверх
LSD
Дата 13.2.2007, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(Opik @  12.2.2007,  15:24 Найти цитируемый пост)
выдернуть юзера по ИД и по Сессии

Цитата(Opik @  12.2.2007,  23:42 Найти цитируемый пост)
Нужно ИЛИ по сессии, ИЛИ по айди

Так И или ИЛИ? smile
Если ИЛИ, то можно и одной HashMap обойтись.
Код
HashMap hashMap = new HashMap();
String name = "Vasya";
Integer id = 1234;
String value = "Pupkin Vasya";
hashMap.put(name, value);
hashMap.put(id, value);

Но будет геморой с удалением значений. Например мы хотим удалить запись по ID, но нужно также будет найти его сессию, чтобы удалить и ее.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
y3u
Дата 13.2.2007, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 9.9.2006
Где: Москва

Репутация: 5
Всего: 13



Цитата(LSD @  13.2.2007,  11:52 Найти цитируемый пост)
Если ИЛИ, то можно и одной HashMap обойтись.


а вот и нельзя smile Есть известное утверждение, что у двух идентичных объектов должен быть идентичный хешкод, но, если мы имеем два идентичных хешкода - отсюда НЕ следует, что объекты идентичные. Вполне легальны ситуации: коллекция не типизированная - значит хеши по стринге и по интеджеру могут совпасть, а если типизированная, то так сделать не даст компилятор smile

Это сообщение отредактировал(а) y3u - 13.2.2007, 13:20


--------------------
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах
PM MAIL   Вверх
LSD
Дата 13.2.2007, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(y3u @ 13.2.2007,  13:17)
а вот и нельзя smile Есть известное утверждение, что у двух идентичных объектов должен быть идентичный хешкод, но, если мы имеем два идентичных хешкода - отсюда НЕ следует, что объекты идентичные. Вполне легальны ситуации: коллекция не типизированная - значит хеши по стринге и по интеджеру могут совпасть, а если типизированная, то так сделать не даст компилятор smile

И какое это имеет отношение, к тому что я сказал?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
y3u
Дата 13.2.2007, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 9.9.2006
Где: Москва

Репутация: 5
Всего: 13



Цитата(LSD @  13.2.2007,  14:23 Найти цитируемый пост)
И какое это имеет отношение, к тому что я сказал? 


прямое

Цитата(LSD @  13.2.2007,  11:52 Найти цитируемый пост)

Integer id = 1234;
String value = "Pupkin Vasya";
hashMap.put(name, value);
hashMap.put(id, value);


скажем, в 1.4 SDK посмотри как работает get(Object key) у HashMap... у тебя медленный код, т.к. хеши id и value могут быть одинаковыми, а реально объекты, находящиеся по этим ключам - разные

вобщем, ладно... это оффтоп smile

Это сообщение отредактировал(а) y3u - 13.2.2007, 15:22


--------------------
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах
PM MAIL   Вверх
LSD
Дата 13.2.2007, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(y3u @  13.2.2007,  15:16 Найти цитируемый пост)
скажем, в 1.4 SDK посмотри как работает get(Object key) у HashMap... у тебя медленный код, т.к. хеши id и value могут быть одинаковыми, а реально объекты, находящиеся по этим ключам - разные

Вообще то, я прелагал искать value или по id, или по name smile 
И хеш код value в данном случае вообще неважен.

Добавлено @ 16:04 
Цитата(y3u @  13.2.2007,  15:16 Найти цитируемый пост)
скажем, в 1.4 SDK посмотри как работает get(Object key) у HashMap... у тебя медленный код, т.к. хеши id и value могут быть одинаковыми, а реально объекты, находящиеся по этим ключам - разные

Я знаю как работает HashMap. Совпадение хешей маловероятно, но не смертельно, в реальных задачах они все равно совпадают.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
sergejzr
Дата 13.2.2007, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 6
Всего: 360



Цитата(y3u @  13.2.2007,  14:16 Найти цитируемый пост)
а реально объекты, находящиеся по этим ключам - разные

Почему они вдруг разные? И там и там указатель на один и тот же обьект.

Пишешь что-то вроде:
Код

class sessionMap extends HashMap
{
public void put(Object key, Object value)
{
//заглушка
}

public void put(Integer userId, Object value)
{
super.put(userId,value);
}
public void put(String sessionId, Object value)
{
super.put(sessionId,value);
}
public void put(Integer userId, String sessionId, User value)
{
super.put(userId,value);
super.put(sessionId,value);
}

public User get(Integer userId)
{
return super.get(userId);
}
public User get(String sessionId)
{
return super.get(sessionId);
}

}


Добавлено @ 16:06 
Цитата(y3u @  13.2.2007,  14:16 Найти цитируемый пост)
у тебя медленный код, т.к. хеши id и value могут быть одинаковыми, а реально объекты, находящиеся по этим ключам - разные

"Медленность" зависит от соотношения размера таблицы к количеству элементов в ней. Тут Ява сама подберёт оптимальную величину.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
y3u
Дата 13.2.2007, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 9.9.2006
Где: Москва

Репутация: 5
Всего: 13



да блин, я описАлся, я имел в виду, конечно, name, а не value... Я вообще только о ключх говорю и все smile Не буду оффтопить дальше, скажу лишь, по поводу реальности задачи, что вероятность совпадения хешей и id и name в данном случае велика, причем вероятность увеличивается с ростом количества пользователей. Просто имеет смысл избегать нежелательных проблем с производительностью в тех случаях, где их реально можно избегать заранее просто и легко. Там же сначала берется хеш, достается индекс из таблицы, потом икуалс смотрится, если не совпадает ьерется следующее совпадение по хешу... Вы же не храните в одной банке соль и сахар на кухне...

Это сообщение отредактировал(а) y3u - 13.2.2007, 16:23


--------------------
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах
PM MAIL   Вверх
sergejzr
Дата 13.2.2007, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 6
Всего: 360



Цитата(y3u @  13.2.2007,  15:22 Найти цитируемый пост)
что вероятность совпадения хешей и id и name в данном случае велика

Не больше, чем совпадение двух разных name.

Цитата(y3u @  13.2.2007,  15:22 Найти цитируемый пост)
причем вероятность увеличивается с ростом количества пользователей.

Не верно. С увеличением количества пользователей наша таблица будет расширятся и уменьшать таким образом вероятность совпадений.
(Размер кстати можно и изначально побольше задать)

Для практически равномерного распределения размер таблицы должен быть примерно N+20% где N - количество элементов хранимых таблице. Что это за объекты - не важно

Цитата(y3u @  13.2.2007,  15:22 Найти цитируемый пост)
Вы же не храните в одной банке соль и сахар на кухне... 

Нет, но книги разных авторов за разное время спокойно стоят на одной полке. И name и id - то и другое для хэштаблицы - объекты с калькулируемым идентификатором.



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Opik
Дата 27.2.2007, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



Написал класс, по совету chief39, 
Код

public class DoubleKey 
{
    Integer id; 
    String session;

    /** Creates a new instance of DoubleKey */
    public DoubleKey(Integer id, String session) 
    {
        this.id = id;
        this.session = session;
    }
    
    public boolean equals(Object o)
    {     
        if (o instanceof DoubleKey) 
        {
              DoubleKey d = (DoubleKey)o; 
              return d.id.equals(id) && d.session.equals(session); 
        } 
        else  
        { 
             return false; 
        }
    }
   

    public int hashCode()
    {
        return id.hashCode() ^ session.hashCode();               
    }
}


Добавляю в HashMap так:
Код

userslist.put(new DoubleKey(user.getId(), session), user);


Как мне бонально проверить на наличие сессии?
Код

userslist.containsKey(session);

не помогает
Код

userslist.containsKey(new DoubleKey(null, session));

аналогично

Это сообщение отредактировал(а) Opik - 27.2.2007, 23:28
PM MAIL Skype   Вверх
nornad
Дата 28.2.2007, 02:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



При такой реализации DoubleKey - никак. Точнее, никак за счёт containsKey. Простой перебор множества ключей сработает, но это простой перебор. В качестве заплатки сработает, если будешь пихать в мапу "пустышку" именно для возможности поиска по сессии:
Код

userslist.put(new DoubleKey(0, session), null);

Искать тогда так:
Код

userslist.containsKey(new DoubleKey(0, session));

null вместо идентификатора пихать нельзя, т.к. будет падать на NullPointer.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1604 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.