Java. Обобщенный класс для представления дерева с любыми данными.

แชร์
ฝัง
  • เผยแพร่เมื่อ 25 ส.ค. 2024
  • Видео рассказывает о том, как написать на Java дженерик, для представления дерева произвольной арности. В качестве данных в узле дерева может выступать любой класс. Кроме этого, разбираем обобщенные функции для построения и обхода такого дерева.
    #ArhiTutorialsJava #ityoutubersru
    Исходники тут:
    github.com/Arh...
    Все видео по Java:
    github.com/Arh...
    Поддержать канал💰:
    yoomoney.ru/to...

ความคิดเห็น • 17

  • @user-qw9cg3is4j
    @user-qw9cg3is4j 8 หลายเดือนก่อน

    Вы отличный преподователь

  • @erikjoomla9872
    @erikjoomla9872 4 ปีที่แล้ว

    Спасибо за видео, всё шикарно объяснили

  • @afonshinMegaPetuh
    @afonshinMegaPetuh 3 ปีที่แล้ว

    крутое видео, только хочется где делают дерево, которое само себя балансирует, по примеру красно черное дерево

    • @arhitutorials
      @arhitutorials  3 ปีที่แล้ว +2

      Ага, пол года назад написал АВЛ дерево на Java, которое самобалансирубщееся. Но видео до сих пор не сделал, потому что не уверен, что смогу понятно объяснить)

    • @afonshinMegaPetuh
      @afonshinMegaPetuh 3 ปีที่แล้ว

      @@arhitutorials жаль, а тоб мне праздник устроили бы)

  • @d.mertsalov
    @d.mertsalov 4 ปีที่แล้ว

    Спасибо за видео! Как всегда, очень познавательно. Какой view компонент использовался для отображения дерева? Про reduce с удовольствием узнал бы подробнее.

    • @arhitutorials
      @arhitutorials  4 ปีที่แล้ว +2

      Использовался обычный RecyclerView. Вся логика по представлению дерева заключена в адаптере. Используется дерево, как в этом видео, только добавлены поля, которые обозначают, развернута ли группа или нет. При клике по группе она помечается как развернутая и адаптер вызывает notifyItemRangeInserted(), чтоб сообщить RecyclerView, где и сколько дочерних элементов добавилось. Когда группа сворачивается - логика та же, вызываем notifyItemRangeRemoved(), сообщаем где и сколько элементов надо убрать. То есть, все сводится к согласованному управлению добавлением и удалением дочерних элементов в адаптере.

    • @d.mertsalov
      @d.mertsalov 4 ปีที่แล้ว

      ​@@arhitutorials, спасибо:)

    • @dmitryponyatov2158
      @dmitryponyatov2158 4 ปีที่แล้ว

      а что есть под десктоп для отображения диаграмм, хотя бы на уровне замены GraphView?

  • @isaevalexey7189
    @isaevalexey7189 ปีที่แล้ว

    Доброго времени суток!!! Отличная подача материала и сам материал шикарный. Есть вопрос: "Для чего у нас модификатор доступа public внутри класса TreeNode - у interface TypeAdapter, а также у статического метода makeTree" Я не так давно занимаюсб java - но по внутреннему ощущению тут тоже protected? Артем, пожалуйста продолжай развивать свой канал - приятно смотреть на мастера своего дела!!!

    • @arhitutorials
      @arhitutorials  ปีที่แล้ว +1

      Если предполагается, что метод будет вызываться кем-то извне класса, то метод public. Если я пишу public, это означает, что согласно моему виденью дизайна класса, этот элемент относится к внешнему интерфейсу класса, а не к его внутреннему устройству, которое снаружи класса не видно.

    • @isaevalexey7189
      @isaevalexey7189 ปีที่แล้ว

      @@arhitutorials Благодарю, спасибо

  • @EdwardNorthwind
    @EdwardNorthwind ปีที่แล้ว

    Проверь плейлисты, а то смотришь плейлист, думаешь все будет последовательно, а оказывается целых 2 видео прошли мимо.

  • @dmitryponyatov2158
    @dmitryponyatov2158 4 ปีที่แล้ว

    Добрый день
    А по объектным графам не планируете видео? Кажется очень удобной структурой данных, в чем-то близкой графовым БД.
    en.wikipedia.org/wiki/Object_graph
    Когда пишу на Python всякие поделки, часто пользуюсь вот такой стековой машиной, которая работает поверх графовой структуры:
    github.com/ponyatov/graph/blob/master/graph.py
    Базовый класс
    class Frame:
    def __init__(self,V):
    self.type = self.__class__.__name__.lower() # поле нужно только для парсерной библиотеки
    self.val = V
    self.slot = {}
    self.nest = []
    Из узлов (наследуемые классы от Frame) формируется направленный граф, можно циклический. Удобно представлять разноообразные связанные данные.
    Каждый узел может иметь скаларное значение, произвольные атрибуты (имя -> ссылка на фрейм), и упорядоченный список ссылок на другие фреймы
    Хотелось бы перетащить это под Java, сделать persisstense для больших графов, и добавить штуки типа сопоставления по шаблону.
    (основное приложение -- базы знаний, и представление исходного кода на произвольных языках для его анализа)

    • @arhitutorials
      @arhitutorials  4 ปีที่แล้ว

      Очень интересно, базы знаний для чего, если не секрет? Искусственным интеллектом занимаетесь?
      Структуру данных надо рассматривать вместе с задачей, для которой ее удобно применять. По сути речь идет о сетевой базе данных. А у них на сегодняшний момент достаточно узкое применение. Сейчас сходу даже не приходит в голову, как и для чего обосновать применение объектного графа.

    • @dmitryponyatov2158
      @dmitryponyatov2158 4 ปีที่แล้ว +1

      @@arhitutorials пара целей для самообучения
      основная цель -- анализ legacy кода, нахавался вдоволь, всегда удивлялся что нет средств позволяющих работать с отпарсенным кодом в виде атрибутированного графа (запросы, трансформации, генерация кода по спекам и т.п.). Под представление кода объектные графы просто идеальная модель, на них бесшовно ложатся AST, атрибутные грамматики, возможно и другие компиляторные структуры, но мне низкий уровень не нужен.
      недавно заинтересовался системами для обучения (eLearning), адаптивное обучение -- там тоже кажется перспективным применить фреймы в качестве представления знаний

    • @arhitutorials
      @arhitutorials  4 ปีที่แล้ว

      В некоторых языках есть встроенные возможности для кодогенерации. Например в Java можно писать процессоры аннотаций и запускать их во время компиляции. Можно исходники на лету создавать, манипулировать AST и даже редактировать или создавать байткод. Чем и пользуются многие библиотеки, делая вещи, которые по другому невозможны. Например, аспектно-ориентированное программирование, корутины, автоматизация внедрения зависимостей и т.п.
      Я кстати думаю, что будущее именно за генерацией кода по спекам. По этому активно интересуюсь этой темой. Мечтаю написать генератор/конструктор приложений)