Java

x2019 (практика по Java) группа

Юрий Литвинов

Студент TODO №1 №2 №3 №4 Тест 1 №5 №6 Тест 2 №8 Тест 3
25 MyTreeSet БД Reflector QSort LinkedHashMap
Гаврилов Данил 2
Гаев Александр 5
Гладков Александр 1
Епифанов Владислав 1
Зуев Максим 2
Левин Лев 3
Махнев Константин 3
Мосин Владислав
Николюкин Михаил 2
Разумова Дарья
Селищев Виталий 2
Смирнов Игорь 3
Тигина Мария 1

Задачи

Тест 3. 13.03.19
  1. LinkedHashMap

    Необходимо реализовать интерфейс Map так, чтобы во время итерации объекты выдавались в порядке добавления.
    Пользоваться LinkedHashMap и другими библиотечными контейнерами нельзя, Abstract* можно.
    Удаление по итератору можно не реализовывать, в возвращаемом Set<Entry<E>> должны работать только iterator и size.
    Инвалидацию итераторов можно не реализовывать.
    Асимптотика всех операций должна соответствовать ожидаемой от HashMap-а.

Домашняя работа 8. 06.03.19
Практика по параллельному программированию (слайды)
  1. QSort

    Реализовать многопоточный вариант быстрой сортировки. Реализовать сравнение с однопоточным вариантом для разного объёма входных данных. Найти размер, при котором многопоточная реализация начинает выигрывать по скорости работы.

    Дедлайн: 15.03.2019, 23:59

Тест 2. 06.03.19
Классы Injector и исключения
  1. Injector

    Необходимо реализовать статический метод Injector.initialize, эмулирующий работу контейнера Dependency Injection. Его основная задача – создать объект класса, полное имя которого передано в параметре rootClassName. Также в метод передается набор доступных классов реализаций, из них выбирается и создаётся по объекту на каждый параметр конструктора.

    • Для каждого такого класса за один initialize должно быть создано не более одного экземпляра.
    • Гарантируется, что каждый класс содержит ровно один конструктор.

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

    public class A {
        public A(Interface1 x) {}
    }
    
    public class B implements Interface1 {}
    
    • Класс A зависит от интерфейса Interface1 (также зависимостью может быть абстрактный или конкретный класс).
    • Таким образом, чтобы создать объект класса A, можно сначала создать объект класса B и передать его в конструктор.
    • Понятно, что зависимости могут быть несколько более замысловатыми.

    • Метод initialize должен завершиться с исключением AmbiguousImplementationException, если найдено несколько разных классов-реализаций одной и той же зависимости (зависимости – это только те классы и интерфейсы, которые встречаются в конструкторах).

    • Метод initialize должен завершиться с исключением ImplementationNotFoundException, если для какой-то зависимости не найдено ни одной реализации.

    • Метод initialize должен завершиться с исключением InjectionCycleException, если зависимости прямо или косвенно образуют цикл.

    • В остальных случаях метод должен вернуть объект класса rootClassName.

Домашняя работа 7. 27.02.19
Правда про enum-ы (слайды)
Mock-объекты (слайды)
Домашняя работа 6. 20.02.19
Effective Java (слайды)
Практика по рефлексии (слайды)
  1. Reflector

    Реализовать класс Reflector с методами

    • printStructure(Class<?> someClass) -- создаёт файл с именем someClass.java.
      • В нём описан класс SomeClass со всеми полями, методами, внутренними и вложенными классами и интерфейсами
      • Методы без реализации
      • Модификаторы видимости и static должны быть такими, как в переданном классе
      • Объявления полей, методов и вложенных классов должны сохранить генериковость
    • diffClasses(Class<?> a, Class<?> b)
      • Выводит все поля и методы, различающиеся в двух классах

    Реализовать тест, печатающий класс, компилирующий полученный файл, грузящий то, что получилось и сравнивающий с исходным

    При этом:

    • Работаем только с классами – интерфейсы, enum-ы и т.д. можно не обрабатывать
    • Можно считать, что внутри нет enum-ов и аннотаций
    • При сравнении двух классов учтите, что <E extends Object> и <E> – это одно и то же

    Дедлайн: 10.03.2019, 23:59

Домашняя работа 5. 13.02.19
Базы данных и Java (слайды)
Базы данных и Java (текст)
Практика по Stream API (слайды)
  1. БД

    Реализовать на одной из рассмотренных технологий консольный телефонный справочник. Он должен уметь хранить имена и номера телефонов, при этом у одного человека может быть несколько телефонов и у одного телефона может быть несколько хозяев. Должно быть можно в интерактивном режиме (в бесконечном цикле) осуществлять следующие операции:

    • 0 - выйти
    • 1 - добавить запись (имя и телефон)
    • 2 - найти телефоны по имени
    • 3 - найти имена по телефону
    • 4 - удалить заданную пару имя-телефон
    • 5 - у указанной пары "имя-телефон" поменять имя
    • 6 - у указанной пары "имя-телефон" поменять телефон
    • 7 - распечатать все пары имя-телефон в справочнике

    (возможны варианты с организацией меню, например, найти по телефону имена и выбрать для изменения имена из выданного списка, если в нём больше одного элемента).
    Решения в стиле "выбрать из базы всё, потом в программе найти нужное" считаются неправильными.

    Дедлайн: 27.02.2019, 10:00

Тест 1. 06.02.19
Юнит-тесты, которые должны проходить
  1. SmartList
    • Необходимо создать класс SmartList, реализующий интерфейс java.util.List.
    public class SmartList<E> implements List<E> {
        ...
    }
    
    • Основная идея — реализовать изменяемый список так, чтобы он был оптимизирован для хранения небольшого количества элементов, но при этом в него можно было добавить произвольное их число.

    • В классе должно быть объявлено ровно два поля:

      • типа int для хранения размера
      • ссылочного типа для хранения данных
    • В зависимости от текущего размера списка в поле для данных хранятся значения разных типов:

      • Если список пуст, то значение этого поля должно быть null
      • Если в списке ровно один элемент, то в этом поле должна храниться ссылка на него
      • Если в списке от 2 до 5 элементов, то в этом поле хранится массив размера 5, элементы которого указывают на соответствующие элементы списка
      • Иначе в этом поле хранится ссылка на обычный ArrayList, в котором хранятся все элементы
    • В классе должно быть определено два конструктора:

      • По умолчанию (без параметров), создает пустой список
      • Принимающий один параметр — коллекцию, элементы которой должны быть добавлены в список
    • Maven/Gradle проект

    • При реализации рекомендуется наследовать ваш класс от AbstractList (хотя он добавляет еще одно поле), и нельзя наследоваться от ArrayList.

    • Стандартные операции коллекций (add/contains/remove и т.д.) должны работать за то же время, что и аналогичные методы в стандартной реализации ArrayList.

Домашняя работа 4. 06.02.19
Экосистема open source проектов (слайды)
Экосистема open source проектов (текст)
  1. CI

    Добавить сборку в CI ко всем предыдущим задачам

    • Так, чтобы проходили юнит-тесты и печаталась информация об их прохождении

    Дедлайн: 20.02.2019, 10:00

Домашняя работа 3. 30.01.19
IDEA code inspections, практика (слайды)
IDEA code inspections, практика (текст)
Коллекции из стандартной библиотеки Java (слайды)
Коллекции из стандартной библиотеки Java (текст)
Интерфейс, который надо реализовать
  1. MyTreeSet

    Необходимо реализовать интерфейс MyTreeSet (из ссылки выше) с использованием бинарного дерева (не обязательно сбалансированного):

    • в реализации должны быть конструктор без параметров и конструктор с параметром типа Comparator<...>
    • методы descendingIterator и descendingSet не должны копировать данные
    • удаление по итератору можно не реализовывать
    • стандартную библиотеку использовать нельзя, разрешается пользоваться Abstract* классами
    • дополнительная задача (+2 балла)
      • инвалидация итератора при модификации дерева

    Дедлайн: 13.02.2019, 10:00

Домашняя работа 2. 23.01.19
Git (слайды)
Git (конспект)
I/O в Java (слайды)
I/O в Java (конспект)
Таблица со штрафами
  1. Trie

    Реализовать бор (http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D0%BE%D1%80)
    Должны быть поддержаны следующие методы:

    • boolean add(String element); (возвращает true, если такой строки ещё не было, работает за O(|element|))
    • boolean contains(String element); (работает за O(|element|))
    • boolean remove(String element); (возвращает true, если элемент реально был в дереве, работает за O(|element|))
    • int size(); (работает за O(1))
    • int howManyStartsWithPrefix(String prefix); (работает за O(|prefix|))

    Также бор должен реализовывать интерфейс (который нужно объявить самим) с методами:

    • void serialize(OutputStream out) throws IOException;
    • void deserialize(InputStream in) throws IOException; (заменяет старое дерево данными из стрима)

    Библиотечными средствами сериализации можно пользоваться только для примитивных типов и строк.

    Дедлайн: 06.02.2019, 10:00

Домашняя работа 1. 16.01.19
Введение (слайды)
Введение (текст)
Юнит-тестирование и системы сборки (слайды)
Юнит-тестирование и системы сборки (текст)
Таблица с баллами за домашки
  1. Хеш-таблица

    Реализовать хеш-таблицу с ключами и значениями типа String, у которой есть следующие функции:

    • int size() --- количество ключей в хеш-таблице
    • boolean contains(String key) --- true, если данный ключ содержится в хеш-таблице
    • String get(String key) --- возвращает значение по ключу, или null, если такого значения нет
    • String put(String key, String value) --- положить в хеш-таблицу значение value по ключу key и вернуть то, что было по этому ключу раньше, либо null, если ничего не было
    • String remove(String key) --- удалить значение по заданному ключу из хеш-таблицы и вернуть удалённое значение, либо null, если такого значения не было
    • void clear() --- очистить хеш-таблицу
    • Написать скрипт сборки для этой задачи на Maven или Gradle, научиться собирать и запускать из консоли.
    • Нужны юнит-тесты и комментарии в формате JavaDoc

    Классы стандартной библиотеки типа HashMap или List использовать нельзя, список надо реализовать вручную отдельным классом.

    Задание надо сдать в виде пуллреквеста из отдельной ветки в собственный репозиторий. Ссылку на пуллреквест надо скинуть сюда.

    Дедлайн: 30.01.2019, 10:00

© 2014-2019 HwProj