JavaRush /Курсы /Java Collections /Большая задача: Создаем сокращатель ссылок

Большая задача: Создаем сокращатель ссылок

Java Collections
6 уровень , 15 лекция
Открыта

— Привет, Амиго!

— Здравия желаю, Капитан Бобров!

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

— Круто. То есть я хотел сказать, я готов, сэр. Но зачем нам это нужно?

— Как это зачем? Боец, кругом враги, нам нужно защитить канал связи. Приступай к задаче.

— Есть, реализовать сервис коротких ссылок.

— Отправляйся к нашему секретному агенту Intellij IDEA, там получишь все инструкции.

— Будет сделано, товарищ капитан!

— Приступайте.

Большая задача: Создаем сокращатель ссылок - 1
16
Задача
Java Collections, 6 уровень, 15 лекция
Недоступна
Shortener (1)
Shortener (1)
9
Задача
Java Collections, 6 уровень, 15 лекция
Недоступна
Shortener (2)
Shortener (2)
16
Задача
Java Collections, 6 уровень, 15 лекция
Недоступна
Shortener (3)
Shortener (3)
16
Задача
Java Collections, 6 уровень, 15 лекция
Недоступна
Shortener (4)
Shortener (4)
16
Задача
Java Collections, 6 уровень, 15 лекция
Недоступна
Shortener (5)
Shortener (5)
32
Задача
Java Collections, 6 уровень, 15 лекция
Недоступна
Shortener (6)
Shortener (6)
32
Задача
Java Collections, 6 уровень, 15 лекция
Недоступна
Shortener (7)
Shortener (7)
32
Задача
Java Collections, 6 уровень, 15 лекция
Недоступна
Shortener (8)
Shortener (8)
32
Задача
Java Collections, 6 уровень, 15 лекция
Недоступна
Shortener (9)
Shortener (9)
32
Задача
Java Collections, 6 уровень, 15 лекция
Недоступна
Shortener (10)
Shortener (10)
16
Задача
Java Collections, 6 уровень, 15 лекция
Недоступна
Shortener (11)
Shortener (11)
16
Задача
Java Collections, 6 уровень, 15 лекция
Недоступна
Shortener (12)
Shortener (12)
16
Задача
Java Collections, 6 уровень, 15 лекция
Недоступна
Shortener (13)
Shortener (13)
32
Задача
Java Collections, 6 уровень, 15 лекция
Недоступна
Shortener (14)
Shortener (14)
16
Задача
Java Collections, 6 уровень, 15 лекция
Недоступна
Shortener (15)
Shortener (15)
9
Задача
Java Collections, 6 уровень, 15 лекция
Недоступна
Shortener (16)
Shortener (16)
Комментарии (107)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
LiudmilaM Уровень 1 Expert
1 сентября 2025
Фуф, это было тяжко. С тестами полезный опыт Ну, и пока исходники хэшмэпа читала, чуть не повесилась
SomeBody098 Уровень 51
8 ноября 2024
Годная задача, очень всего многого узнал
Long_byte Уровень 60
2 октября 2024
я понял как устроен изнутри hashmap и примерно как работает методы но что мы пишем и что получится и где будет использоваться то что мы написали какую функцию будет исполнять данное приложение не совсем понятно
overbf bf Уровень 42
19 сентября 2023
в shortener(7) от вот этого куска в правильном решении знатно подгорело: if (key != null ? !key.equals(entry.key) : entry.key != null) return false; return value != null ? value.equals(entry.value) : entry.value == null; а вроде можно же вот так?: if (!Objects.equals(key, entry.key) || !Objects.equals(value, entry.value)) { return false; } return true; а вот так нельзя, потому что нет такого объекта null у которого мы пытаемся вызвать equals if (!key.equals(entry.key) || !value.equals(entry.value)){ return false; } return true; хммм....
И. Ж. Уровень 41
27 декабря 2023
Вот так приняло: public boolean equals(Object o) { Entry entry = (Entry) o; if (!Objects.equals(key, entry.key)) return false; return Objects.equals(value, entry.value); }
wokku Уровень 51
3 сентября 2023
Отличная задача👍 Реально много нового узнаешь, хоть и местами нереально самому допереть.
Евгений Уровень 38
7 июня 2023
Годная задача
8 апреля 2024
ЧЕм?
StrangeAngel Уровень 46
2 мая 2023
Интересная задача. Мне понравилась. Ещё бы побольше опыта работы с библиотеками и вообще бы шикарно.
Василий Чи Уровень 1
27 января 2023
Как добавить библиотеку в IntelliJ IDEA Версия Guava 19 — 2015 года, поэтому я подключил версию 31.1, с ней всё тоже прекрасно работает. Вот ссылка: Guava 31.1 Ссылка на Apache Commons Collections: Apache Commons Collections
Antonina Pitertseva Уровень 2
12 декабря 2022
Полезные ссылочки для подключения библиотеки Guava от Google: https://github.com/google/guava/wiki/Release19 https://mvnrepository.com/artifact/com.google.guava/guava/19.0 https://javadevblog.com/kak-dobavit-biblioteku-jar-fajl-v-proekt-intellij-idea.html
Олег Шукюров Уровень 41
5 декабря 2022
Ребята, т.к данная задача все таки о том как разобрать HashMap «по косточкам» авторы с ней справились не до конца, настоятельно рекомендую дочитать до конца что я напишу, не пожалеете, от этих знаний на одном из собесов ошалел человек который его проводил. Все мы знаем что позиция элемента определяется по хэшкоду объекта, да, дальше по пальцам как это? Допустим у нас есть Map <Integer, String> мы пытаемся добавить один элемент 20, “str”. При создание Map под капотом создается массив Entry[] на 16 элементов(это дефолтное значение, initial capacity можно указать свое значение в скобках при создании Map) После нашей попытки добавить элемент выше происходит вот что. Высчитывается хешкод обьекта в нашем случае 20 (Хэшкод объектов типа Integer равен их значению), сейчас самая магия - данный результат делится с остатком на длину массива 20 % 16 = 4, это и есть будущая позиция данного элемента в Map. Еще одна важная вещь, как увеличивается размер хэшмап? Все очень просто, в Map имеется такая константа LOAD_FACTORY которая равняется 0.75, после каждого добавления элемента сначала проверяется длина внутреннего массива Entry[] если количество элементов в Map в нашем случае 16 * LOAD_FACTORY = 12, больше или равно 12, размер внутреннего массива удваивается и ВСЕ ПОЗИЦИИ наших элементов ПЕРЕСЧИТЫВАЮТСЯ по описанному мною выше сценарию. Т.е теперь если добавлять наш Integer (20) позиция в таблице будет равна 20 % 32 = 20; HashSet действует по такому же принципу.
Евгений Уровень 38
24 мая 2023
Чувак, спасибо, господи, где ты раньше был?
Нейросеть Уровень 41
21 августа 2023
Это ещё не магия. Заглянул я в HashMap в идее и увидел такую строчку

 if ((p = tab[i = (n - 1) & hash]) == null)
            tab[i] = new Node(hash, key, value, null);
Во первых эта череда присваиваний внутри всего что только вздумается уже удивила. Я даже не знал что так можно. Во вторых индекс считается по следующей формуле

(n - 1) & hash
Оказывается длинна массива в HashMap может быть только степенью двойки. Соответсвенно если к примеру по дефолту у нас 16, то

16 = 10000
Соответственно 16 - 1

15 = 011111
Если взять пример выше и предположить, что метод hash() вернул 20(хотя в хэше мапы прячется магия не менее бодрая), то получаем

20 == 10100
(16 - 1) & 20 == 011111 & 10100 == 00100 == 4 
wokku Уровень 51
2 сентября 2023
Всё так, но начиная с java 8 создается массив Node, а не Entry.