Java I

HSE-2017 группа

Тимофей Брыксин

Студент TODO №1 №2 №3 Тест 1 №4 №6 Тест 2 №7 Тест 3
7 Reflector QSort LinkedHashMap
Бабушкин Арсений 1
Бажанов Аркадий 2
Буков Антон
Краснорядцева Анастасия
Кузьмин Сергей 1
Люборт Константин
Малышева Мария 1
Нефедов Андрей 1
Олемская Александра
Пальченкова Мария
Сурков Максим
Трилис Алексей
Федоркина Мария
Шершнев Иван 1

Задачи

Тест 3. 13.03.19
  1. LinkedHashMap

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

Домашняя работа 7. 06.03.19
Практика по параллельному программированию
  1. QSort

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

    Дедлайн: 20 марта 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.

Домашняя работа 6. 27.02.19
Enums
Mock-объекты
  1. Reflector

    Реализуйте класс с методами printStructure() и diffClasses().

    Метод printStructure() должен принимать на вход объект someClass типа Class<?>, в результате его работы данного в текущем каталоге должен быть создан java файл c текстом данного класса:
    - Данный файл должен быть валидным, т.е. компилироваться.
    - В файле должен быть описан публичный класс с именем SomeClass.
    - В этом классе должны быть объявлены все поля, методы, внутренние, вложенные классы и интерфейсы.
    - У всех элементов класса должны быть проставлены модификаторы идентичные модификаторам исходного класса.
    - Тип возвращаемого значения у методов должен совпадать с оригинальным.
    - Generic методы и внутренние классы должны сохранить свою generic-сущность.

    Метод diffClasses() должен принимать на вход два класса и выводить на экран все различные поля и методы в этих классах. Должен также присутствовать тест, который получает на вход класс, создает по нему java-файл, компилирует этот файл, загружает полученный класс и сравнивает его с исходным.

    Некоторые замечания:
    - Уделите особое внимание использованию wildcard'ов (? super, ? extends).
    - Считайте, что внутри классов не встречаются enum и аннотации. Поддержка того или другого принесет вам по одному дополнительному баллу за каждое.
    - В метод printStructure() можно передавать только классы. Enum, интерфейсы, аннотации и т.д. можно не обрабатывать.
    - Обратите внимание на обработку примитивных типов, когда возвращаете значение.
    - При сравнении двух классов обратите внимание, что <E extends java.lang.Object> и <E> -- это одно и то же.

    Дедлайн 13 марта 23:59

Домашняя работа 5. 20.02.19
Практика по рефлексии
Effective Java
Домашняя работа 4. 13.02.19
Практика по Stream API
СУБД (слайды)
СУБД (текст)
  1. DB

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

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

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

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

  2. CI

    Настроить сборку и запуск тестов на Travis-CI для всех предыдущих задач.

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

Тест 1. 06.02.19
Экосистема open source проектов (слайды)
Экосистема open source проектов (конспект)
  1. SmartList

    Необходимо создать класс SmartList, реализующий интерфейс java.util.List.java

    public class SmartList<E> implements List<E> {
    ...
    }

    • Основная идея — реализовать изменяемый список так, чтобы он был оптимизирован для хранения небольшого количества элементов, но при этом в него можно было добавить произвольное их число.

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

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

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

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

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

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

    Тесты, которые должны проходить: https://gist.github.com/yurii-litvinov/85cc529fa7037495af1fa23d350a6b2f.

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

    Необходимо реализовать интерфейс MyTreeSet с использованием бинарного дерева:

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

    Дедлайн – 23:59 13.02.19

Домашняя работа 2. 23.01.19
I/O (слайды)
I/O (текст)
git (слайды)
git (текст)
  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 howManyStartWithPrefix(String prefix); (работает за O(|prefix|))

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

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

    Стандартный сериализатор использовать нельзя.

    Дедлайн: 23:59 06.02.19

Домашняя работа 1. 16.01.19
Введение (слайды)
Введение (конспект)
Юнит-тестирование и системы сборки (слайды)
Юнит-тестирование и системы сборки (конспект)
Система штрафов
Результаты с баллами
  1. HashTable

    Реализовать хеш-таблицу с ключами и значениями типа 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() --- очистить хеш-таблицу

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

    Задание надо сдать в виде пуллреквеста из отдельной ветки в собственный репозиторий, в который меня надо добавить как коллаборатора. Мой профиль на гитхабе: https://github.com/jzuken. Ожидаются комментарии в формате JavaDoc и использование системы сборки gradle (или maven). Ссылку на пуллреквест надо скинуть сюда.

    Жесткий дедлайн: 23:59:59 30 января, но начинать пытаться сдавать надо гораздо раньше.

© 2014-2019 HwProj