diff --git a/src/main/java/ru/naumen/collection/task1/Task1.java b/src/main/java/ru/naumen/collection/task1/Task1.java index a69ab0b..988baa6 100644 --- a/src/main/java/ru/naumen/collection/task1/Task1.java +++ b/src/main/java/ru/naumen/collection/task1/Task1.java @@ -1,5 +1,8 @@ package ru.naumen.collection.task1; +import java.util.HashMap; +import java.util.Map; + /** * Дано: *
@@ -24,6 +27,26 @@ */ public class Task1 { + /** + *Для задачи выбрана коллекция {@link HashMap}, так как в задаче необходимо + * по объекту {@link Ticket} получать связанное значение (тип {@link Goods}).
+ * + *В типичных условиях операции добавления и получения элементов в HashMap + * выполняются за O(1) - константное время. + * Типичными условиями является достаточное количество бакетов и правильно + * реализованные методы {@code equals()} и {@code hashCode()}. + * В худшем случае (много коллизий) сложность может достигать O(n)
+ * + *Размер хеш-таблицы выбирал так -> загуглил самый большой по вместимости зал в России, и начал + * решать кейс относительно него. + * Это оказался "Государственный Кремлёвский дворец" на 6 000 гостей. + * Зашел на сайт ГКД, проверил, на какое количество мероприятий можно купить билет, + * оказалось, что это 31 мероприятие, это может быть не максимум, так что округлил до 35. + * Для уменьшения коллизий следует брать в 2 раза больше бакетов, чем планируется элементов, + * так что количество бакетов в хеш-талице будет: 6 000 * 35 * 2 = 420 000.
+ */ + MapinternetService = new HashMap<>(420_000); + public enum Goods { /** * нет товаров @@ -43,7 +66,6 @@ public enum Goods { * Получить товары по билету */ public Goods getGoods(Ticket ticket) { - // TODO реализовать - return null; + return internetService.get(ticket); } -} +} \ No newline at end of file diff --git a/src/main/java/ru/naumen/collection/task1/Ticket.java b/src/main/java/ru/naumen/collection/task1/Ticket.java index d0374dd..7dfe9eb 100644 --- a/src/main/java/ru/naumen/collection/task1/Ticket.java +++ b/src/main/java/ru/naumen/collection/task1/Ticket.java @@ -9,4 +9,30 @@ public class Ticket { private long id; private String client; + + /** + * Сравнивает текущий билет с другим объектом на равенство. + * Используется для корректной работы HashMap + * + * @param o Объект, с которым выполняется сравнение + * @return {@code true}, если оба объекта представляют один и тот же билет (по {@code id}); + * {@code false} - в ином случае + */ + @Override + public boolean equals(Object o) { + if (this == o) return true; // Быстрая проверка для случая совпадения ссылок + if (o == null || getClass() != o.getClass()) return false; // Проверка типа объекта + Ticket ticket = (Ticket) o; + return id == ticket.id; // Сравнение по id + } + + /** + * Возвращает хеш-код билета. + * Хеш-код рассчитывается на основе {@code id}, для согласования с {@link #equals(Object)}. + * @return хеш-код, вычисленный из id билета + */ + @Override + public int hashCode() { + return Long.hashCode(id); + } }