Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Java] Задачка для ума


Автор: Atum 23.10.2009, 12:00
Добрый день !

предлагаю всем пользователям отвлечься и порешать такую вот интересную задачу :

имеется  две Даты  ( типа  java.util.Date)  сегодня и какая то другая тестовая  дата 

требуется отнести эту тестовую дату в одну из групп : 

Давно, В прошлом Месяце, 
В этом месяце ,на прошлой неделе, на этой неделе , 
вчера, сегодня, завтра, 
на следующей неделе, В Следующем месяце, Нескоро .

и того 11 групп . 

пользоваться можно только типом дата и его методами 
( Calendar  использовать нельзя , если только настенный  smile )

Пример определения дня : 
Код

  String res = "Неизвестно";

            if (sendDate.getYear() == today.getYear() &&
                    sendDate.getMonth() == today.getMonth() &&
                    sendDate.getDate() == today.getDate()) {
                res = "Сегодня";
            }


Нескоро : 
Код

            if (sendDate.getYear() == today.getYear() 
                    && (today.getMonth() + 1) < sendDate.getMonth()) {
                res = "Нескоро";
            }



для тех кто решит задачу есть , как в школе подпункты (сложность) : 

1)  требуется учитывать - переход через особую точку - это Новый год 
2) требуется учитывать первую неделю в году - что считать первой неделей года
3)  требуется учитывать - что в разных странах неделя начинается по разному 
      с Понедельника или Воскресенья 

4) требуется учитывать что есть переход на летнее и зимнее время 

тому кто придумает самый красивый алгоритм - приз smile))  


для тех кому сложно работать с датами - по 11 группам :

попробуйте для начала распределить по Кварталам и по Декадам

Автор: fixxer 23.10.2009, 12:50
Почему нельзя пользоваться Calendar? Можно ж написать (скопипастить smile ) свой. Глупая задачка. 

Автор: ivanovpv 23.10.2009, 15:51
Ну да по сути предлагается написать собственный календарь... Или по крайней мере классик обладающий 90% признаков календаря.
Какую тут ищет красоту автор - не понимаю. Класс описывающий календарь - ох он некрасив... Сам лично писал на С++ - а если писать путем то надо отсчитывать високосные дни в общем мраки  smile 

Некое подобие красивости можно соблюсти на самой функции проверяющей признаки, ну типа 
Код

public enum When 
{
    TODAY, YESTERDAY, LASTMONTH, NEXTMONTH
}
public String isWhen(Date original, Date check, When when)
{
      switch(when)
      {
             case TODAY:
                 //
                 break;
             case YESTERDAY:
                 //
                 break;
      }
/*
....*/
}|


Автор: Ares4322 23.10.2009, 17:25
Ну это задача не глупая, но с нее обычно начинают изучать Java. Да и не только Java, наверное)

Автор: Temdegon 23.10.2009, 17:26
Определяем сколько милисекунд в сутках.
потом вычитаем date1.getTime()  - date2.getTime(), получаем разность дат в милисекундах.
Знак результата покажет проешдая дата или будущая.
Делим результат на кол-во милисек в сутках, и  узнаем сколько дней разница между датами.

Автор: goodday1941 23.10.2009, 17:32
у  java.util.Date с геттеров только метод getTime() не deprecated на данным момент
тоесть в идеале юзать только его нужно, а Вы в ваших примерах используете deprecated методы, что не есть хорошо

ну и далее с класса Date товарищи настоятельно советуют использовать календарь для такого рода задач)

Добавлено через 1 минуту и 55 секунд
Цитата(Ares4322 @  23.10.2009,  17:25 Найти цитируемый пост)
Ну это задача не глупая, но с нее обычно начинают изучать Java. Да и не только Java, наверное) 

не согласен что с такого начинают )

Цитата(Temdegon @  23.10.2009,  17:26 Найти цитируемый пост)
Делим результат на кол-во милисек в сутках, и  узнаем сколько дней разница между датами.

и толку? сегодня понедельник вчера было воскресение ) разница один день а недели разные ;)

Автор: Temdegon 23.10.2009, 17:45
Цитата

и толку? сегодня понедельник вчера было воскресение ) разница один день а недели разные ;) 

да, действительно, лоханулся smile
тогда надо искать алгоритм вычисления дня недели,
типа http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B4%D0%BD%D1%8F_%D0%BD%D0%B5%D0%B4%D0%B5%D0%BB%D0%B8

Автор: goodday1941 23.10.2009, 18:02
да неплохо если знать год месяц и день, а у нас в распоряжении только колличество милисикунд от первого января 1970 года )

Автор: powerOn 23.10.2009, 22:14
Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 

Автор: Atum 23.10.2009, 22:44
для тех кому не очень интересна такая задача - можете ее и не решать smile 

я нашел два решения . которые меня порадовали. 

скажу сразу - ,как мне кажется , у такой задачи нет строгого математического алгоритма . 

и все решения это просто переборы  и проверка условий. 

Решение date1.getTime()  - date2.getTime() тоже имеет место быть , и если его довести до конца - то наверное будет красиво .


для чего я разместил тут эту задачу: 

 в детстве нас учили работать в числами и цифрами  от 0 до 9 , потом в институте на сказали что есть другие системы исчисления с другим основанием и 1+1 = 10... 

тут я предлагаю поломать голову над тем как мыслить в терминах календаря smile 

проще всего сказать - что задача не имеет  смысла и очень простая, но стоит начать 
 ее решать и вы понимаете что не так все просто smile и есть над чем подумать . 

P.s.
deprecated  методы использовать можно. Это есть в условии .


что я понимаю под красивым решением - это постараться уйти от обычного перебора , а использовать фантазию , 

например взять за основу - 
«Вечный» табель-календарь для определения дня недели любой календарной даты старого и нового стилей.

и находить нужное решение без особых математических расчетов smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)