Tuesday, July 16, 2013

Использование HashSet и TreeSet

HashSet и TreeSet - две наиболее распространенные реализации интерфейса Set в Java Collections Framework. Первая основана на использовании функции hashCode и структуры данных “хеш-таблица”, вторая - на основе сравнения элементов и структуры данных “бинарное дерево” (точнее красно-черное дерево). Знание и понимание отличий этих структур данных необходимо для любого программиста. К сожалению, многие лишь поверхностно рассматривают их, что приводит к созданию неэффективного кода, а  иногда и к багам. Познакомиться с этими и другими классами коллекций Java можно, посмотрев урок 10 из курса Java для тестировщиков. Для детального изучения необходимо читать дополнительную литературу. В данном видео Вы познакомитесь с некоторыми особенностями этих классов, незнание которых может привести к возникновению ошибок или изобретению новых “велосипедов”.

Я думаю, что некоторым из Вас это видео может показаться неинтересным, не открывшим ничего нового. Это хорошо, что Вы знаете эти темы - подождите следующих видео :) А я буду рад за тех, кто почерпнет что-то полезное из этого материала. Потому что на самом деле, реальные баги в реальных проектах, которые мне пришлось отлавливать, возникли как раз из-за невнимательности (или незнания) при работе с этими реализациями
Set.

Так как многие из Вас хотят домашнего задания, чтобы потренировать навыки программирования, то вот одно, среднего уровня сложности:

Написать программу, которая выводит 3 блока информации:
  • список праздников на сегодняшний день
  • список праздников на завтрашний день
  • список праздников на ближайшие 5 дней, не включая сегодняшний и завтрашний дни
Список праздников прочитать при старте программы из этого файла: holidays.txt.zip
Каждую строку в этом файле преобразовать в объект класса
Holiday, который implements Comparable<Date>, и который будет иметь два поля: Date date и String name.
Для хранения объектов
Holiday в памяти использовать TreeSet.
Результат работы программы должен быть приблизительно таким:


#>java package.name.ShowHoliday
Сегодня:
Праздник 1
Праздник 2

Завтра:
Праздник 3
Праздник 4

Скоро:
Ср, 17 июля - Праздник 5
            - Праздник 6
Чт, 18 июля - Праздник 7
            - Праздник 8


Реализовать в программе возможность передать заданный день и количество дней в командной строке. В этом случае вывести все праздники на этот день и на следующее количество дней, оформив вывод так, как сделано в блоке “Скоро” при обычном запуске программы.

P.S. Если вдруг кому интересно, то для формирования файла с праздниками я написал shell-скрипт на bash, который посылает запросы на сайт и парсит праздники с результирующей страницы. Вы можете скачать скрипт и поиграться с ним (нужен Linux): holiday_parse.sh


Ну и, собственно, видео:


No comments: