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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> HashMap<MyClass, String>. Get key, Получение значений по сложному ключу 
:(
    Опции темы
DissDoc
Дата 23.6.2011, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

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



Всем привет!
Появилась проблема (решения не требую, прошу указать ЧТО искать и как искать), не могу найти решения в нете. Видно плохо ищу
Собственно, есть класс свой (который работает как ключ)
Код

// Не буду описывать все методы получения и обработки переменных
// чтобы не загромождать саму идею
class MyClass {
    public int point;
    public int line;
}

Собственно заполняем значениями HashMap. 
Код

HashMap<MyClass,String> hm = new HashMap<MyClass, String>();
hm.put(new MyClass(1,1), "test1");
hm.put(new MyClass(1,2), "test2");
hm.put(new MyClass(2,1), "test3");

Так вот вопрос. можно ли как-то заставить HashMap отдавать по ключу hm.get(new MyClass(1, -1)) значения test1 и test2?
PM MAIL WWW   Вверх
Stolzen
Дата 23.6.2011, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 23
Всего: 48



Я правильно понял, вы хотите получить результат только по первому полю, без второго? Вообще тогда лучше создать свой контейнер.  Использовать HashMap в таком случае - плохая идея.

Так же можно сделать ассоциативный контейнер, который по первому полю возвращает другой ассоциативный контейнер, в котором уже первое поле равно заданному во всех объектах. Если нужно будет вернуть объект MyClass(1, 1), то будет что-то типа
map.get(1).get(2)

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

Храните лучше данные в базе и с помощью sql делайте что душе угодно.


З.Ы. в прологе хорошо было бы - что-нибудь типа get(1, _) и все smile

Это сообщение отредактировал(а) Stolzen - 23.6.2011, 10:27


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
DissDoc
Дата 23.6.2011, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

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



ммм... В базе в данном случае плохо
Я вначале собираю все данные о 3д модели. А потом их каким-то образом формирую в виде дерева.
И вот собственно и хотел через hashMap
Но вы подали интересную идею
Буду пробовать

Тем не менее жду еще советов)
PM MAIL WWW   Вверх
Stolzen
Дата 23.6.2011, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 23
Всего: 48



Цитата(DissDoc @  23.6.2011,  12:17 Найти цитируемый пост)
ммм... В базе в данном случае плохо

Можно использовать что-нибудь типа SQLite которая будет хранится в памяти, а не на жестком - работа с ней будет очень быстрая. 


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
DissDoc
Дата 23.6.2011, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

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



А вот это уже интересно.
Я же тоже фактически в памяти храню значения.

PM MAIL WWW   Вверх
Skipy
Дата 23.6.2011, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А можно посмотреть на реализацию equals и hashCode у MyClass?


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
Temdegon
Дата 23.6.2011, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 7
Всего: 9



Skipy, +100500
Реализуйте equals и hashCode и все должно заработать.
PM MAIL   Вверх
Stolzen
Дата 24.6.2011, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 23
Всего: 48



Цитата(Temdegon @  23.6.2011,  19:17 Найти цитируемый пост)
Реализуйте equals и hashCode и все должно заработать. 

Ну не совсем "все". После правильной реализации equals и hashCode у HashMap не появится несвойтсвенных ему возможностей.


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
LSD
Дата 24.6.2011, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(Stolzen @  24.6.2011,  02:06 Найти цитируемый пост)
После правильной реализации equals и hashCode у HashMap не появится несвойтсвенных ему возможностей.

А какие критерии "правильности"? smile


По сабжу можно использовать TreeMap и свой компаратор.


--------------------
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   Вверх
Stolzen
Дата 24.6.2011, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 23
Всего: 48



Цитата(LSD @  24.6.2011,  11:03 Найти цитируемый пост)
А какие критерии "правильности"? smile

Например:
- Соблюденный контракт 
- Равномерное распределение результатов хеш-функции
- Маленькое число коллизий 

Ну а вообще - Effective Java second edition, items 8-9 


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
Skipy
Дата 24.6.2011, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата
А какие критерии "правильности"? smile


http://download.oracle.com/javase/6/docs/a...va.lang.Object)
http://download.oracle.com/javase/6/docs/a...html#hashCode()

Цитата
По сабжу можно использовать TreeMap и свой компаратор.


Нельзя. Суть в том, что чем бы ни руководствовалась коллекция при проверке эквивалентности ключа, эта проверка всегда одинакова. А автор хочет, чтобы при помещении в коллекцию учитывались оба значения, а при извлечении - одно в некоторых случаях не учитывалось бы. Так не бывает. Про equals/hashcode я на самом деле так спросил, для проформы. Чтобы не расслаблялись. А исходное требование так просто не реализуемо, надо писать собственную коллекцию, которая это умеет. 


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
LSD
Дата 24.6.2011, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(Stolzen @  24.6.2011,  11:22 Найти цитируемый пост)
Например:
- Соблюденный контракт 
- Равномерное распределение результатов хеш-функции
- Маленькое число коллизий 

Ну а вообще - Effective Java second edition, items 8-9  

Цитата(Skipy @  24.6.2011,  12:18 Найти цитируемый пост)
http://download.oracle.com/javase/6/docs/a...va.lang.Object)
http://download.oracle.com/javase/6/docs/a...html#hashCode()

Спасибо копетаны smile , но ни один из этих критериев не говорит, что в сравнении должны участвовать все поля объекта. Так что не вижу противоречий с:
Цитата(Temdegon @  23.6.2011,  19:17 Найти цитируемый пост)
Реализуйте equals и hashCode

... так чтобы они реализовали сравнение только по первому полю.


--------------------
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   Вверх
Stolzen
Дата 24.6.2011, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 23
Всего: 48



Цитата(LSD @  24.6.2011,  12:43 Найти цитируемый пост)
... так чтобы они реализовали сравнение только по первому полю. 

Ну да, но это же не значит, что HashMap или TreeMap сможет после этого сразу несколько значений возвращать.

Да и это нерправильно - объекты-то получаются разными, поэтому второе поле нужно учитывать, реализуя equals
Следовательно, по контракту его нужно и в hashCode использовать.

Это сообщение отредактировал(а) Stolzen - 24.6.2011, 12:12


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
LSD
Дата 24.6.2011, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(Stolzen @  24.6.2011,  13:02 Найти цитируемый пост)
Ну да, но это же не значит, что HashMap или TreeMap сможет после этого сразу несколько значений возвращать.

TreeMap+Comparator+subMap()  smile 


Цитата(Stolzen @  24.6.2011,  13:02 Найти цитируемый пост)
Да и это нерправильно - объекты-то получаются разными

А откуда известна логика, какие объекты считать разными, а какие одинаковыми? 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   Вверх
Stolzen
Дата 24.6.2011, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 23
Всего: 48



Цитата(LSD @  24.6.2011,  15:32 Найти цитируемый пост)
А откуда известна логика, какие объекты считать разными, а какие одинаковыми? smile 

Я осмелился предположить  smile 

Ну а вообще иногда же все-таки такой контейнер предполагается использовать по назначению. Как тогда вытащить MyClass(1,1), если для MyClass(1,2) и MyClass(1,3) и equals, и hashCode одно и то же возвращают?

А, ну да, реализовать компаратор... Все равно это танцы с бубном 


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

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

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


 




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


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

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