| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Выбор между Map, Set |
| Автор: druff 22.1.2008, 16:11 |
| Добрый день! Уже несколько дней читаю разные книги по коллекциям, в принципе большинство информации понятно, но нужен совет по реализации классов. Предположим в субд есть две таблицы, с уникальным набором полей: ТАРИФ (два поля: дата изменения и значение. первичные ключи я опустил, потому что они к делу не относятся) и, скажем, НОРМА (тоже два поля: дата изменения и значение). Необходимо подгрузить эти таблицы в память в виде объектов. Т.е. тоже должно получится два списка, и здесь я не знаю: 1) Что лучше выбрать: хранить дату в качестве ключа, а сам объект будет содержать только значение или же сделать объект с теми же полями из таблицы? В процессе жизни программы в эти списки могут добавляться новые объекты и нужно будет их сортировать заново. В этих списках мне нужен поиск по дате. 2) Из этих двух объектов желательно сформировать ещё один список который должен содержать уникальный набор (дата, значениеТАРИФА, значениеНОРМЫ). Как это лучше реализовать? так же как в пункте 1? работа с этими коллекциями может совершаться достаточно часто, поэтому скорость работы важна |
| Автор: druff 22.1.2008, 17:44 | ||
Не уверен, что правильно понял то, что понимается под термином "ключ" применительно к Set. Можешь пояснить? |
| Автор: COVD 22.1.2008, 18:31 |
| в основе Set и Map лежит массив Object[]. В обоих случаях при добавлении используется обьект key (ключ) - put(key) для Set или put(key, value) для Map. В Set в массиве сохраняется ссылка на key, в Map - ссылка на обьект value. А индекс, куда положить ссылку, вычисляется по хешкоду обьекта key. |
| Автор: druff 24.1.2008, 15:58 |
| Упс. Значит это я недопонял документацию. Я посчитал, что реализовав интерфейс Comparable в своём классе из двух полей (дата и значение) смогу сделать поиск в коллекции своих объектов по дате. Однако тот же binarySearch всё равно требует в качестве параметра объект, а дату брать отказывается :( Значит поиск нужно реализовывать самому? |
| Автор: druff 24.1.2008, 16:17 |
| Или же можно создать фиктивный объект, присвоить ему нужную дату и делать поиск по этому объекту? |
| Автор: LSD 24.1.2008, 17:02 | ||||
На самом деле можешь, просто надо сделать типа такого:
хотя это и будет нарушением контракта. |
| Автор: druff 24.1.2008, 17:14 |
| Попробовал сделать как в примере - всё равно не даёт. В binarySearch всё же можно скармливать ключ только того же типа, что и элементы в коллекции. Зато с фиктивным объектом всё получилось и заработало. Если вначале склонялся к Set или Map, то сейчас выяснил, что средств поиска у них вообще нет (только переводить в массив). Поэтому буду работать с List |
| Автор: LSD 24.1.2008, 17:22 | ||||
Уж не знаю, что ты пробовал:
Выдаёт 1 как и ожидалось. |
| Автор: druff 24.1.2008, 17:30 | ||||
| О, действительно если создавать список как
то на binarySearch с поиском по дате выдаёт ошибку, а если
то ошибки нет |
| Автор: LSD 24.1.2008, 17:32 | ||
А нет, ошибка все таки есть, но она в другом:
|