JavaRush /Курсы /Java Collections /Большая задача: Class AbstractList

Большая задача: Class AbstractList

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

— Привет, боец!

— Поздравляю тебя с повышением уровня квалификации. Нам нужны отчаянные парни.

— Уверен, у тебя есть еще много нерешенных задач. Самое время решить парочку из них!

14
Задача
Java Collections, 1 уровень, 15 лекция
Недоступна
Построй дерево(1)
Амиго, похоже ты уже достаточно окреп. Самое время проверить свои навыки в большой задаче! Сегодня реализуем свое дерево немного нестандартным способом(на базе AbstractList). Вводную информацию можешь получить используя свой любимый поисковик и текст ниже.
14
Задача
Java Collections, 1 уровень, 15 лекция
Недоступна
Построй дерево(2)
Несмотря на то, что наше дерево является потомком класса AbstractList, это не список в привычном понимании. В частности, нам недоступны методы, принимающие в качестве параметра индекс элемента. Такие методы необходимо переопределить и бросить новое исключение типа UnsupportedOperationException.
14
Задача
Java Collections, 1 уровень, 15 лекция
Недоступна
Построй дерево(3)
Класс, описывающий дерево, мы создали, теперь нужен класс, описывающий тип элементов дерева: 1) В классе CustomTree создай вложенный статический параметризированный класс Entry<T> с модификатором доступа по умолчанию. 2) Обеспечь поддержку этим классом интерфейса Serializable. 3) Создай такие поля
28
Задача
Java Collections, 1 уровень, 15 лекция
Недоступна
Построй дерево(4)
Любое дерево начинается с корня, поэтому не забудь в класс CustomTree добавить поле root типа Entry<String> c модификатором доступа по умолчанию. Инициируй его в конструкторе CustomTree, имя (elementName) не важно. Итак, основа дерева создана, пора тебе поработать немного самому. Вспомним как должно выглядеть наше дерево.
28
Задача
Java Collections, 1 уровень, 15 лекция
Недоступна
Построй дерево(5)
Добавлять в дерево элементы мы можем, теперь займись удалением: необходимо реализовать метод remove(Object o), который будет удалять элемент дерева имя которого было полученного в качестве параметра.
Комментарии (352)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
6 декабря 2024
Выполнил без рекурсии вот таким способом, для оптимизации можно в конце цикла удалять элементы и чуть поменять условие - будет все быстро

        list = new ArrayList<>();
            list.add(root);
            for (int i = 0; i < list.size(); i++){
                //тут добавляем деток при выполнении или не выполнении условий
            }
SomeBody098 Уровень 51
16 сентября 2024
наикрутейшая задача, сначала вообще не понятно что где и когда, но когда почитаешь про бинарные деревья и вчитаешься в условие - то наконец понимаешь что от тебя требуют 😊 вот вам статьи которые мне помогли: Бинарные деревья — решение алгоритмических задач Бинарные деревья поиска и рекурсия – это просто
Андрей Уровень 37 Expert
14 августа 2024
Сделал такую функцию для поиска:

 private void findEntryTemplate(Entry<String> entry, Predicate<Entry> filter, List<Entry> result) {
        if (entry != null) {
            if (filter.test(entry)) {
                result.add(entry);
            }
            findEntryTemplate(entry.leftChild, filter, result);
            findEntryTemplate(entry.rightChild, filter, result);
        }
    }
Из нее можно искать что угодно. 1. Находим нужный нам элемент, String s = "10"

List<Entry> list = ArrayList();
findEntryTemplate(root, e -> e.elementName.equals(s), list )
  System.out.println(list);
2. Находим все елементы(количество)

...
findEntryTemplate(root, e -> true, list )
 System.out.println(list.size());
3. Находим невалидные ентити

...
 findEntryTemplate(root, entry -> entry.leftChild == null && !entry.isAvailableToAddChildren() && entry.rightChild == null, list);
...
Из минусов - рекурсия. Как вы потом узнаете , на проектах рекурсию не используют(крайне редко). Решение от JR заслуживает чтобы его не просто глянуть а и изучить. Во первых когда придете на коммерческий проект - там будет такая же требухня. И вам никто не даст разрешение на удаление всего и написать все с чистого листка(правило - работает не трогай). Привыкайте к этому. Вам придется разбираться и еще самому догавнокодывать...
Long_byte Уровень 53
12 августа 2024
рекурсивный обход это в глубину а через очередь это обход в ширину?
Андрей Уровень 37 Expert
14 августа 2024
Стек обход в глубину, очередь обход в ширину. Свежайшая статья на хабре
Кот Уровень 39
13 мая 2024
Фуух, спустя два дня всё-таки закрыл эту задачу. Что могу сказать: 1. Ощущения непередаваемые. Когда решаешь "зеленые" или "желтые" задачи, тоже получаешь лёгкое удовлетворение, но это не сравнится по сравнению с закрытием сложной "красной" задачи, которую решал несколько часов/дней/недель. 2. Стоит ли решать? ДА. Здесь согласен с very junior java developer, эта задача очень сильно прокачивает абстрактное мышление и не ограничивает в выборе реализации. Я например решил используя два списка. 3. Доп. материалы. Мне очень помог Р. Лафоре и его "Алгоритмы и структуры данных", а конкретно часть про двоичные деревья. 4. 16 элемент добавляйте к 1, валидатор пропускает. 5. Впервые у меня в коде меньше строк чем в правильном решении!😅 5. Ну и конечно желаю удачи в обучении. Если вы здесь, значит вы уже прошли половину пути!
SomeBody098 Уровень 51
16 сентября 2024
да, книжка Лафоре тоже мне помогла, да задача крута )))
Anonymous #3369914 Уровень 42 Expert
21 апреля 2024
Решать однозначно, но своим методом. Заранее правильное решение лучше не смотреть, оно слишком накрученное. Все решается значительно проще и короче. Максимум, что можно глянуть в привильном решение это переменные, для понимания общей логики (и того как обьекты хранятся и между собой связанны). И да, прямо хорошо разберитесь в условиях. Они хреновые, согласен, ориентируйтесь на картинки.
Евгений N Уровень 23
17 марта 2024
2JR: извините, вообще не понял что в этих задачах происходит, что требуется и как их решать. и даже не смог разобраться в правильном решении. концепцию использования "queue" не уловил. просьба пересмотреть этот блок.
Long_byte Уровень 53
12 августа 2024
в этих задачках использование queue очень помогает например метод add сначала добавляем в queue корневой узел root потом пока queue не пустой! получаем первый добавленный элемент и удаляем его из queue это у нас root у корневого узла проверяем если нет возможности иметь потомков и нет ни одного потомка то нужно сделать так чтобы он имел возможность иметь потомков availableToAddLeftChildren = true availableToAddRightChildren = true; если это условие не проходит проверяем можем ли мы добавить левого потомка если нет то правого если нет значит уже есть левый и правый потомок добавляем в очередь сначала левого потомка потом правого и так далее. queue желательно использовать локальные на все методы свои
Юрій Якимчук Уровень 33
14 марта 2024
Після квесту мультітредінг "велика задача" з п'яти задач? Ой ліл
Roman Уровень 33
9 февраля 2024
Условия написаны так, что в деталях не понятно чего требуется сделать. Проще выполнить задачу своими методами чисто для себя, как сам понимаешь условия и наплевать на валидатор, двигать дальше.
Глеб Арбузов Уровень 35
18 января 2024
может я чего-то не понимаю, но я сделал все за 2.5 часа, без подглядывания в правильный ответ. Можно сразу на собес на сеньора идти?