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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как в TreeSet хранить два(или более) элемента? 
:(
    Опции темы
Wowa
Дата 8.12.2005, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

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



Как в TreeSet хранить два(или более) элемента?
Например: имя и фамилию. Плюс может быть дату рождения.

Нужно именно в TreeSet.
PM WWW   Вверх
LSD
Дата 8.12.2005, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Создай объект:
Код
public class Human
{
  public String firstName, lastName;
}



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


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

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



LSD - спасибо. Кое-что понятнее стало.. А теперь дальше вопрос о создании органайзераsmile

Мне нужно с помощью Treeset и "Comparable"-интерфейса создать два класса: Termin и Terminplan.
Terminplan может включать в себя сколько-угодно заметок, т.е. терминов(термин=заметка=время встречи, обеда или еще чего-либо). Это нужно для создания чего-то типа органайзера smile



Код

public class Terminplan
{

}

public class Termin
{
  public String name, start_time, end_time;
}


public static void main(String[] args){       
...
termine = new TreeSet();
..

}


Объект Termin как-то должен храниться в объекте Terminplan. Есть предложения?
Добавлено @ 23:53
Вероятно, чтобы хранить start_time и end_time нужно использовать java.util.Date.
PM WWW   Вверх
LSD
Дата 8.12.2005, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Т.е. как я понял Terminplan являет собой коллекцию объектов. Можно или просто взять одну из готовых и унаследовать от нее, или написать свой класс а в нем уже использовать коллекцию для хранения. Все зависит от того что надо от Terminplan. Понятно что там будет поиск, но какой поик конкретного объекта или по отдельным полям? Требуется ли уникальность Termin в пределах одного Terminplan? Еще что от него требуется?


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


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

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



Одна встреча(термин) не может пересекаться с другой по времени. Если при добавлении новой встречи в ежедневник(органайзер) там уже есть запись с таким же временем, то нужно Exception выдавать...


В дальнейшем нужно класс Termin сделать абстрактным. И с помощью его создать еще два класса(один для праздников, а второй для назначенных встречь, переговоров и т.п.). Для праздничных дней(чтобы их туда заносить). Праздничные дни не имеют времени, а только дату ведь. И они не должны быть помехой для того, чтобы в этот день что-либо другое делать. Например, с кем-то поужинать вечером. Т.е. я так думаю, что праздничные дни должны отдельно храниться, в отдельном объекте, который унаследывает объект Termin. Правильно?
Добавлено @ 00:03
Цитата(LSD @ 8.12.2005, 21:56)
Т.е. как я понял Terminplan являет собой коллекцию объектов.

Я плохо понимаю, что такое коллекция объектов. Ну, вероятно конечно унаследует, т.к. в нем будут храниться объекты Termin. Это и является коллекцией?
Добавлено @ 00:11
Цитата(LSD @ 8.12.2005, 21:56)
Понятно что там будет поиск, но какой поик конкретного объекта или по отдельным полям?

В принципе, по полям поиск... А как иначе искать объект можно? Только Итератором перебирать?
PM WWW   Вверх
LSD
Дата 9.12.2005, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(Wowa @ 9.12.2005, 00:02)
Я плохо понимаю, что такое коллекция объектов. Ну, вероятно конечно унаследует, т.к. в нем будут храниться объекты Termin. Это и является коллекцией?

Да, коллекция это просто некия набор объектов.


Цитата(Wowa @ 9.12.2005, 00:02)
В дальнейшем нужно класс Termin сделать абстрактным. И с помощью его создать еще два класса(один для праздников, а второй для назначенных встречь, переговоров и т.п.). Для праздничных дней(чтобы их туда заносить). Праздничные дни не имеют времени, а только дату ведь. И они не должны быть помехой для того, чтобы в этот день что-либо другое делать. Например, с кем-то поужинать вечером. Т.е. я так думаю, что праздничные дни должны отдельно храниться, в отдельном объекте, который унаследывает объект Termin. Правильно?

На мой взгляд да. Что-то типа такого:
Код
public class Terminplan
{
  private HashSet plans = new HashSet();
  
  public void add(Termin termin)
  {
    plans.add(termin);
  }
  
  public void remove(Termin termin)
  {
    plans.remove(termin);
  }

  public Termin[] getAll()
  {
    return (Termin[]) plans.toArray(new Termin[plans.size()]);
  }
}

public abstract class Termin
{
}

public class MeetengTermin extends Termin
{
  private Date begin, end;

  public MeetengTermin(Date begin,Date end)
  {
    if(begin == null || end == null)
      throw new NullPointerException();
    this.begin = begin;
    this.end = end;
  }

  public boolean equals(Object obj)
  {
    if(obj instanceof MeetengTermin)
    {
      MeetengTermin termin = (MeetengTermin) obj;
      if( (termin.begin.after(begin) && termin.begin.before(end)) || (termin.end.after(begin) && termin.end.before(end)))
        return true;
    }
    return false;
  }
}

public class HolidayTermin extends Termin
{
  private Date date;
  
  public HolidayTermin(Date date)
  {
    if(date == null)
      throw new NullPointerException();
    this.date = date;
  }

  public boolean equals(Object obj)
  {
    if(obj instanceof HolidayTermin)
      return( (HolidayTermin) obj).date.equals(date);
    else
      return false;
  }
}

Два HolidayTermin считаются одинаковыми если они выпадают на один день, а два MeetengTermin одинаковые если у них пересекаются время начало и время конца. Два одинаковых Termin в Terminplan не добавишь.

Цитата(Wowa @ 9.12.2005, 00:02)
В принципе, по полям поиск... А как иначе искать объект можно? Только Итератором перебирать?

Вопрос в скорости. Если скорость не критична то можно и итератором, а если нужно искать быстро то можно и ускорить его с помощью эдаких "индексов" в виде TreeSet-ов. (если нужно завтра покажу как это делается).


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


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

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



LSD спасибо! А как можно HashSet заменить на TreeSet тут?
PM WWW   Вверх
Wowa
Дата 9.12.2005, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

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



А вот моя функция main.
Код

    public static void main(String[] args) {
        int action;
        print_menu();  //Распечатка меню программы
        action = action_select(); //Получаем номер выбранного пункта меню
        
        Terminplan plan = new Terminplan();        
        
        switch(action) {
        case '1':
                                                //Тут надо ввод с клавиатуры еще получить. Как это сделать в нужном формате?
            plan.add(termin);
        break;
        case '2':
            plan.remove(termin);
                    break;
        case '3':
            plan.getAll();
        break;
        }
        
    }


Как осуществить ввод новой встречи(термина) с клавиатуры? Нам нужно запросить "название" и "дату с временем". Стоит ли для каждого ввида ввода(ввод для занесения в базу, ввод названия для удаления из базы..) делать отдельный класс?

В каком формате я получу массив от plan.getAll(); ? Как мне его распечатать?
PM WWW   Вверх
LSD
Дата 9.12.2005, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(Wowa @ 9.12.2005, 01:04)
А как можно HashSet заменить на TreeSet тут?

Для использования TreeSet, надо чтобы Termin реализовывал интерфейс Comparable или написать свой Comparator. А чем вызвано требование использовать именно TreeSet?


Цитата(Wowa @ 9.12.2005, 10:05)
Как осуществить ввод новой встречи(термина) с клавиатуры?

Консоль, ГУИ?


Цитата(Wowa @ 9.12.2005, 10:05)
Стоит ли для каждого ввида ввода(ввод для занесения в базу, ввод названия для удаления из базы..) делать отдельный класс?

Нет. Лучше сделать унифицированный класс который может использоваться для все типов ввода (все равно там код на 90% будет один и тот же), и просто указывать у него тип интерфейса (для добавления, удаления или изменения).


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


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

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



Цитата(LSD @ 9.12.2005, 08:57)
Консоль, ГУИ?

консоль
Добавлено @ 12:11
Цитата(LSD @ 9.12.2005, 08:57)
А чем вызвано требование использовать именно TreeSet?

Постановкой задачи smile
А для нее больше подходит HashSet?
PM WWW   Вверх
LSD
Дата 9.12.2005, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(Wowa @ 9.12.2005, 12:10)
А для нее больше подходит HashSet?

Обычно HashSet лучше подходит для этих целей.
У TreeSet преимущество состоит в том что: он отсортирован и время доступа гарантировано не превышает некую константу независимо от входных данных (у HashSet при неудачном рапределении hash кодов, время доступа может быть очень большим, но при правильном распределении он быстрее). Зато TreeSet требует больше времени на вставку/удаление элементов, из-за необходимости балансировки дерева.

Ввод одного поля можно осуществить так:
Код
try
{
  System.out.print(promt);
  BufferedReader reader = new BufferedReader(new InputStreamReader(System.in, "Cp866"));
  String str = reader.readLine();
  DateFormat df = DateFormat.getDateInstance();
  date = df.parse(str);
}
catch(IOException e)
{
  e.printStackTrace();
}
catch(ParseException e)
{
  e.printStackTrace();
}


P.S. На выходных могу накидать более подробный примерчик с Terminplan-ми, если надо.


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


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

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



LSD а как добавить введенные данные в наш план?
Так ведь нельзя?
plan.add(date, str);
PM WWW   Вверх
LSD
Дата 10.12.2005, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Я немного модифицировал предыдущий примерчик

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  Termin.zip 2,51 Kb


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


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

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



LSD Спасибо!

А есть идеи, как можно сохранить эти все встречи как-то в файл, а потом при след. запуске программы загрузить из файла?
PM WWW   Вверх
LSD
Дата 14.12.2005, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Простейший способ сериализовать. Что то наподобие этого (на HashMap не обращай внимание, это я для друга делал демонстрашку):
Код
  public static void main(String[] args)
  {
    try
    {
      HashMap map = new HashMap();
      map.put("а", "собакаа");
      map.put("б", "собакаб");
      map.put("в", "собакав");
      FileOutputStream out = new FileOutputStream("dictionary.dat");
      ObjectOutputStream objectOut = new ObjectOutputStream(out);
      objectOut.writeObject(map);
      objectOut.close();
      out.close();

      map = null;

      FileInputStream in = new FileInputStream("dictionary.dat");
      ObjectInputStream objectIn = new ObjectInputStream(in);
      map = (HashMap) objectIn.readObject();
      objectIn.close();
      in.close();
      System.out.println("map.get(\"а\") = " + map.get("а"));
      System.out.println("map.get(\"б\") = " + map.get("б"));
      System.out.println("map.get(\"в\") = " + map.get("в"));
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
  }


Только надо будет сделать все объекты сериализуемыми (implements Serializable).
Добавлено @ 13:28
В принипе можно и CSV засунуть и в XML. Это посложнее, зато возможно будет и из других приложений работать с этими данными. Будет интерестно расскажу как.


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

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

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


 




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


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

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