Домашние задания

Домашнее задание 1. Обход файлов

  1. Разработайте класс Walk, осуществляющий подсчет хэш-сумм файлов.
    1. Формат запуска:
      java Walk <входной файл> <выходной файл>
    2. Входной файл содержит список файлов, которые требуется обойти.
    3. Выходной файл должен содержать по одной строке для каждого файла. Формат строки:
      <шестнадцатеричная хэш-сумма> <путь к файлу>
    4. Для подсчета хэш-суммы используйте алгоритм FNV.
    5. Если при чтении файла возникают ошибки, укажите в качестве его хэш-суммы все нули.
    6. Кодировка входного и выходного файлов — UTF-8.
    7. Размеры файлов могут превышать размер оперативной памяти.
    8. Пример
      Входной файл
      samples/1
      samples/12
      samples/123
      samples/1234
      samples/1
      samples/binary
      samples/no-such-file
                              
      Выходной файл
      050c5d2e samples/1
      2076af58 samples/12
      72d607bb samples/123
      81ee2b55 samples/1234
      050c5d2e samples/1
      8e8881c5 samples/binary
      00000000 samples/no-such-file
                               
  2. Сложный вариант:
    1. Разработайте класс RecursiveWalk, осуществляющий подсчет хэш-сумм файлов в директориях.
    2. Входной файл содержит список файлов и директорий, которые требуется обойти. Обход директорий осуществляется рекурсивно.
    3. Пример:
      Входной файл
      samples/binary
      samples
      samples/no-such-file
                              
      Выходной файл
      8e8881c5 samples/binary
      050c5d2e samples/1
      2076af58 samples/12
      72d607bb samples/123
      81ee2b55 samples/1234
      8e8881c5 samples/binary
      00000000 samples/no-such-file
                              
  3. При выполнении задания следует обратить внимание на:
    • Дизайн и обработку исключений, диагностику ошибок.
    • Программа должна корректно завершаться даже в случае ошибки.
    • Корректная работа с вводом-выводом.
    • Отсутствие утечки ресурсов.
    • Возможность повторного использования кода.
  4. Требования к оформлению задания.
    • Проверяется исходный код задания.
    • Весь код должен находиться в пакете info.kgeorgiy.ja.фамилия.walk.

Репозиторий с тестами

Домашнее задание 2. Множество на массиве

  1. Разработайте класс ArraySet, реализующий неизменяемое упорядоченное множество.
    • Класс ArraySet должен реализовывать интерфейс SortedSet (простой вариант) или NavigableSet (сложный вариант).
    • Все операции над множествами должны производиться с наилучшей асимптотической эффективностью.
  2. При выполнении задания следует обратить внимание на:
    • Применение стандартных коллекций.
    • Избавление от повторяющегося кода.
    • Отсутствие unchecked warnings при компиляции.
    • Отсутствие излишних подавленных unchecked warnings.

Домашнее задание 3. Студенты

  1. Разработайте класс StudentDB, осуществляющий поиск по базе данных студентов.
    • Класс StudentDB должен реализовывать интерфейс StudentQuery (простой вариант) или GroupQuery (сложный вариант).
    • Каждый метод должен состоять из ровно одного оператора. При этом длинные операторы надо разбивать на несколько строк.
  2. При выполнении задания следует обратить внимание на:
    • применение лямбда-выражений и потоков;
    • избавление от повторяющегося кода.

Домашнее задание 4. Реализация потоков

  1. Разработайте класс Streams, реализующий сплитераторы для деревьев и дополнительные коллекторы.
    • Простой вариант (интерфейс EasyStreams) — реализуйте:
      • сплитераторы для двоичных деревьев, двоичных деревьев с известным размером, k-ичных деревьев;
      • коллекторы первого, последнего, среднего элементов;
      • коллекторы общего префикса и суффикса строк;
      • преобразователь строки в её непустые префиксы;
      • преобразователь, оставляющий каждый n-й элемент;
      • преобразователь, оставляющий префикс потока состоящий из уникальных элементов.
    • Сложный вариант (интерфейс HardStreams) — дополнительно реализуйте:
      • сплитераторы всех видов деревьев над списками элементов;
      • коллектор k-ого элемента;
      • коллекторы первых и последних n элементов.
      • преобразователь строки в её непустые суффиксы;
      • преобразователь, оставляющий i-й из каждого n-элементного окна;
      • преобразователь, оставляющий префикс потока, для которых функция выдаёт уникальные элементы.
  2. При выполнении задания следует обратить внимание на:
    • характеристики создаваемых сплитераторов;
    • избавление от повторяющегося кода.

Домашнее задание 5. Implementor

  1. Реализуйте класс Implementor, генерирующий реализации классов и интерфейсов.
    • Аргумент командной строки: полное имя класса/интерфейса, для которого требуется сгенерировать реализацию.
    • В результате работы должен быть сгенерирован java-код класса с суффиксом Impl, расширяющий (реализующий) указанный класс (интерфейс).
    • Сгенерированный класс должен компилироваться без ошибок.
    • Сгенерированный класс не должен быть абстрактным.
    • Методы сгенерированного класса должны игнорировать свои аргументы и возвращать значения по умолчанию.
  2. В задании выделяются три варианта:
    • ПростойImplementor должен уметь реализовывать только интерфейсы (но не классы). Поддержка generics не требуется.
    • СложныйImplementor должен уметь реализовывать и классы, и интерфейсы. Поддержка generics не требуется.
    • БонусныйImplementor должен уметь реализовывать generic-классы и интерфейсы. Сгенерированный код должен иметь корректные параметры типов и не порождать unchecked warnings.

Домашнее задание 6. Jar Implementor

Это домашнее задание связано с предыдущим и будет приниматься только с ним. Предыдущее домашнее задание отдельно сдать будет нельзя.

  1. Создайте .jar-файл, содержащий скомпилированный Implementor и сопутствующие классы.
    • Созданный .jar-файл должен запускаться командой java -jar.
    • Запускаемый .jar-файл должен принимать те же аргументы командной строки, что и класс Implementor.
  2. Модифицируйте Implementor так, чтобы при запуске с аргументами -jar имя-класса файл.jar он генерировал .jar-файл с реализацией соответствующего класса (интерфейса). Для компиляции можно использовать код из тестов.
  3. Вы можете создавать файлы и директории в текущем каталоге, но не за его пределами.
  4. Для проверки, кроме исходного кода, также должны быть представлены:
    • скрипт для создания запускаемого .jar-файла, в том числе, исходный код манифеста;
    • запускаемый .jar-файл.
  5. Сложный вариант. Решение должно быть модуляризовано.

Домашнее задание 7. Javadoc

Это домашнее задание связано с двумя предыдущими и будет приниматься только с ними. Предыдущие домашние задания отдельно сдать будет нельзя.

  1. Документируйте класс Implementor и сопутствующие классы с применением Javadoc.
    • Должны быть документированы все классы и все члены классов, в том числе private.
    • Документация должна генерироваться без предупреждений.
    • Сгенерированная документация должна содержать корректные ссылки на классы стандартной библиотеки и модулей info.kgeorgiy.java.advanced.*.
  2. Для проверки, кроме исходного кода, также должны быть представлены:
    • скрипт для генерации документации (он может рассчитывать, что рядом с вашим репозиторием склонирован репозиторий курса);
    • сгенерированная документация.

В последующих домашних заданиях все public и protected сущности должны быть документированы.