Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Общие вопросы > Как в TreeSet хранить два(или более) элемента? |
Автор: Wowa 8.12.2005, 23:36 |
Как в TreeSet хранить два(или более) элемента? Например: имя и фамилию. Плюс может быть дату рождения. Нужно именно в TreeSet. |
Автор: LSD 8.12.2005, 23:39 | ||
Создай объект:
|
Автор: Wowa 8.12.2005, 23:48 | ||
LSD - спасибо. Кое-что понятнее стало.. А теперь дальше вопрос о создании органайзера![]() Мне нужно с помощью Treeset и "Comparable"-интерфейса создать два класса: Termin и Terminplan. Terminplan может включать в себя сколько-угодно заметок, т.е. терминов(термин=заметка=время встречи, обеда или еще чего-либо). Это нужно для создания чего-то типа органайзера ![]()
Объект Termin как-то должен храниться в объекте Terminplan. Есть предложения? Добавлено @ 23:53 Вероятно, чтобы хранить start_time и end_time нужно использовать java.util.Date. |
Автор: LSD 8.12.2005, 23:56 |
Т.е. как я понял Terminplan являет собой коллекцию объектов. Можно или просто взять одну из готовых и унаследовать от нее, или написать свой класс а в нем уже использовать коллекцию для хранения. Все зависит от того что надо от Terminplan. Понятно что там будет поиск, но какой поик конкретного объекта или по отдельным полям? Требуется ли уникальность Termin в пределах одного Terminplan? Еще что от него требуется? |
Автор: Wowa 9.12.2005, 00:02 | ||||
Одна встреча(термин) не может пересекаться с другой по времени. Если при добавлении новой встречи в ежедневник(органайзер) там уже есть запись с таким же временем, то нужно Exception выдавать... В дальнейшем нужно класс Termin сделать абстрактным. И с помощью его создать еще два класса(один для праздников, а второй для назначенных встречь, переговоров и т.п.). Для праздничных дней(чтобы их туда заносить). Праздничные дни не имеют времени, а только дату ведь. И они не должны быть помехой для того, чтобы в этот день что-либо другое делать. Например, с кем-то поужинать вечером. Т.е. я так думаю, что праздничные дни должны отдельно храниться, в отдельном объекте, который унаследывает объект Termin. Правильно? Добавлено @ 00:03
Я плохо понимаю, что такое коллекция объектов. Ну, вероятно конечно унаследует, т.к. в нем будут храниться объекты Termin. Это и является коллекцией? Добавлено @ 00:11
В принципе, по полям поиск... А как иначе искать объект можно? Только Итератором перебирать? |
Автор: LSD 9.12.2005, 00:33 | ||||||||
Да, коллекция это просто некия набор объектов.
На мой взгляд да. Что-то типа такого:
Два HolidayTermin считаются одинаковыми если они выпадают на один день, а два MeetengTermin одинаковые если у них пересекаются время начало и время конца. Два одинаковых Termin в Terminplan не добавишь.
Вопрос в скорости. Если скорость не критична то можно и итератором, а если нужно искать быстро то можно и ускорить его с помощью эдаких "индексов" в виде TreeSet-ов. (если нужно завтра покажу как это делается). |
Автор: Wowa 9.12.2005, 01:04 |
LSD спасибо! А как можно HashSet заменить на TreeSet тут? |
Автор: Wowa 9.12.2005, 10:05 | ||
А вот моя функция main.
Как осуществить ввод новой встречи(термина) с клавиатуры? Нам нужно запросить "название" и "дату с временем". Стоит ли для каждого ввида ввода(ввод для занесения в базу, ввод названия для удаления из базы..) делать отдельный класс? В каком формате я получу массив от plan.getAll(); ? Как мне его распечатать? |
Автор: LSD 9.12.2005, 10:57 | ||||||
Для использования TreeSet, надо чтобы Termin реализовывал интерфейс Comparable или написать свой Comparator. А чем вызвано требование использовать именно TreeSet?
Консоль, ГУИ?
Нет. Лучше сделать унифицированный класс который может использоваться для все типов ввода (все равно там код на 90% будет один и тот же), и просто указывать у него тип интерфейса (для добавления, удаления или изменения). |
Автор: Wowa 9.12.2005, 12:10 | ||||
консоль Добавлено @ 12:11
Постановкой задачи ![]() А для нее больше подходит HashSet? |
Автор: LSD 9.12.2005, 12:24 | ||||
Обычно HashSet лучше подходит для этих целей. У TreeSet преимущество состоит в том что: он отсортирован и время доступа гарантировано не превышает некую константу независимо от входных данных (у HashSet при неудачном рапределении hash кодов, время доступа может быть очень большим, но при правильном распределении он быстрее). Зато TreeSet требует больше времени на вставку/удаление элементов, из-за необходимости балансировки дерева. Ввод одного поля можно осуществить так:
P.S. На выходных могу накидать более подробный примерчик с Terminplan-ми, если надо. |
Автор: Wowa 9.12.2005, 12:34 |
LSD а как добавить введенные данные в наш план? Так ведь нельзя? plan.add(date, str); |
Автор: LSD 10.12.2005, 17:50 |
Я немного модифицировал предыдущий примерчик |
Автор: Wowa 14.12.2005, 13:20 |
LSD Спасибо! А есть идеи, как можно сохранить эти все встречи как-то в файл, а потом при след. запуске программы загрузить из файла? |
Автор: LSD 14.12.2005, 13:26 | ||
Простейший способ сериализовать. Что то наподобие этого (на HashMap не обращай внимание, это я для друга делал демонстрашку):
Только надо будет сделать все объекты сериализуемыми (implements Serializable). Добавлено @ 13:28 В принипе можно и CSV засунуть и в XML. Это посложнее, зато возможно будет и из других приложений работать с этими данными. Будет интерестно расскажу как. |
Автор: Wowa 16.12.2005, 05:12 | ||||
И что, прямо все данные сами сериализируются и запишутся в файл???? Добавлено @ 05:13
или как их нужно сериализировать до этого? в переменную? |
Автор: batigoal 16.12.2005, 08:54 | ||
Да. |
Автор: LSD 16.12.2005, 10:45 | ||
Чтобы объект был сериализуемым, он должен реализовывать интерфейс Serializable (это пустой интерфейс там нет методов, так что достаточно написать в объявлении класса implements Serializable). А дальше все дерево связанных объектов записывается в поток одной командой objectOut.writeObject(map). Можешь запусть тот примерчик, он рабочий. |