Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 25 additions & 3 deletions src/main/java/ru/naumen/collection/task1/Task1.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package ru.naumen.collection.task1;

import java.util.HashMap;
import java.util.Map;

/**
* Дано:
* <pre>
Expand All @@ -24,6 +27,26 @@
*/
public class Task1
{
/**
* <p>Для задачи выбрана коллекция {@link HashMap}, так как в задаче необходимо
* по объекту {@link Ticket} получать связанное значение (тип {@link Goods}).</p>
*
* <p>В типичных условиях операции добавления и получения элементов в HashMap
* выполняются за <b>O(1)</b> - константное время.
* Типичными условиями является достаточное количество бакетов и правильно
* реализованные методы {@code equals()} и {@code hashCode()}.
* В худшем случае (много коллизий) сложность может достигать <b>O(n)</b></p>
*
* <p>Размер хеш-таблицы выбирал так -> загуглил самый большой по вместимости зал в России, и начал
* решать кейс относительно него.
* Это оказался "Государственный Кремлёвский дворец" на 6 000 гостей.
* Зашел на сайт ГКД, проверил, на какое количество мероприятий можно купить билет,
* оказалось, что это 31 мероприятие, это может быть не максимум, так что округлил до 35.
* Для уменьшения коллизий следует брать в 2 раза больше бакетов, чем планируется элементов,
* так что количество бакетов в хеш-талице будет: <b>6 000 * 35 * 2 = 420 000</b>.</p>
*/
Map<Ticket, Goods> internetService = new HashMap<>(420_000);

public enum Goods {
/**
* нет товаров
Expand All @@ -43,7 +66,6 @@ public enum Goods {
* Получить товары по билету
*/
public Goods getGoods(Ticket ticket) {
// TODO реализовать
return null;
return internetService.get(ticket);
}
}
}
26 changes: 26 additions & 0 deletions src/main/java/ru/naumen/collection/task1/Ticket.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}