Существует ли какой-либо стандартный класс библиотеки Java для представления дерева в Java?
В частности, мне нужно представить следующее:
- Поддерево в любом узле может иметь произвольное количество дочерних элементов
- Каждый узел (после корня) и его потомки будут иметь строковое значение
- Мне нужно получить все дочерние элементы (своего рода список или массив строк) данного узла и его строковое значение (т. Е. Метод, который будет принимать узел в качестве входных данных и возвращать все строковые значения дочернего узла в качестве выходных данных).
Есть ли какая-либо доступная структура для этого или мне нужно создать свою собственную (если это так, предложения по реализации будут хорошими).
Ответы:
Вот:
Это базовая древовидная структура, которую можно использовать для
String
любого другого объекта. Довольно просто реализовать простые деревья, чтобы делать то, что вам нужно.Все, что вам нужно добавить - это методы для добавления, удаления, обхода и конструкторы. Это
Node
основной строительный блокTree
.источник
Tree
класс не нужен, потому что каждыйNode
может рассматриваться как дерево.Еще одна древовидная структура:
Пример использования:
БОНУС
Смотрите полноценное дерево с:
https://github.com/gt4dev/yet-another-tree-structure
источник
hasNext()
перед каждым вызовом,next()
чтобы получить действительные результаты. Это не частьIterator
спецификации.На самом деле в JDK реализована довольно хорошая древовидная структура.
Посмотрите на javax.swing.tree , TreeModel и TreeNode . Они предназначены для использования с ним,
JTreePanel
но на самом деле это довольно хорошая реализация дерева, и ничто не мешает вам использовать его без интерфейса Swing.Обратите внимание, что начиная с Java 9 вы можете не использовать эти классы, поскольку они не будут присутствовать в «Компактных профилях» .
источник
Что насчет этого?
источник
setAsParent
илиgetHead
делают, и это время, когда я действительно мог получить некоторую помощь по древовидным структурам данных. Даже первоисточник документа не имеет комментариев.Я написал небольшую библиотеку, которая обрабатывает общие деревья. Это гораздо легче, чем качели. У меня также есть проект Maven для этого.
источник
Очевидно, вы можете добавить служебные методы для добавления / удаления детей.
источник
Вы должны начать с определения того, что такое дерево (для домена), лучше всего это сделать сначала определив интерфейс . Не все древовидные структуры являются изменяемыми, возможность добавлять и удалять узлы должна быть дополнительной функцией, поэтому мы создаем дополнительный интерфейс для этого.
Нет необходимости создавать объекты узлов, которые содержат значения , на самом деле я вижу это как главный недостаток и издержки проектирования в большинстве реализаций дерева. Если вы посмотрите на Swing,
TreeModel
классы узлов не используются (DefaultTreeModel
используются толькоTreeNode
), поскольку они на самом деле не нужны.Изменяемая древовидная структура (позволяет добавлять и удалять узлы):
Учитывая эти интерфейсы, код, который использует деревья, не должен сильно заботиться о том, как реализовано дерево. Это позволяет использовать как общие, так и специализированные реализации , где вы реализуете дерево, делегируя функции другому API.
Пример: структура дерева файлов
Пример: общая древовидная структура (основанная на родительских / дочерних отношениях):
источник
Ни один ответ не упоминает слишком упрощенный, но работающий код, так что вот оно:
источник
Вы можете использовать любой XML API Java в качестве Document и Node. Поскольку XML представляет собой древовидную структуру со строками
источник
Если вы делаете кодирование на доске, собеседование или даже просто планируете использовать дерево, многословия их немного.
Далее следует сказать, что причина, по которой дерево не существует, как, скажем, a
Pair
(о котором можно сказать то же самое), заключается в том, что вы должны инкапсулировать свои данные в классе, используя его, и самая простая реализация выглядит следующим образом:Это действительно так для дерева произвольной ширины.
Если вам нужно двоичное дерево, его часто проще использовать с именованными полями:
Или, если вы хотели Trie:
Теперь вы сказали, что хотите
Это звучит как твоя домашняя работа.
Но так как я достаточно уверен, что любой срок уже прошел ...
Это заставляет вас использовать как:
источник
В том же ключе, что и в ответе Гарета, проверьте DefaultMutableTreeNode . Это не универсальный, но в остальном, кажется, отвечает всем требованиям. Хотя он находится в пакете javax.swing, он не зависит от классов AWT или Swing. На самом деле, исходный код на самом деле имеет комментарий
// ISSUE: this class depends on nothing in AWT -- move to java.util?
источник
В Java есть пара древовидных структур данных, таких как DefaultMutableTreeNode в JDK Swing, пакет синтаксического анализатора Tree in Stanford и другие игрушечные коды. Но ничего из этого не достаточно, но достаточно мало для общего назначения.
Проект Java-дерева пытается обеспечить другую структуру данных общего назначения в Java. Разница между этим и другими
источник
Поскольку вопрос требует доступной структуры данных, дерево может быть построено из списков или массивов:
instanceof
может использоваться для определения того, является ли элемент поддеревом или терминальным узлом.источник
Object
Ы будет либо объекты листа (например,String
с) или ветви (представленные массивами). И это работает: этот код скомпилируется, и он создает небольшое деревоString
s.Столь же простой, как это получается, и очень простой в использовании. Чтобы использовать это, расширьте это:
источник
Например :
источник
В прошлом я просто использовал для этого вложенную карту. Это то, что я использую сегодня, это очень просто, но соответствует моим потребностям. Может быть, это поможет другому.
источник
Я написал небольшой класс TreeMap, основанный на HashMap, который поддерживает добавление путей:
Его можно использовать для хранения дерева вещей типа «T» (универсального), но (пока) не поддерживается хранение дополнительных данных в его узлах. Если у вас есть такой файл:
Затем вы можете сделать это дерево, выполнив:
И вы получите красивое дерево. Это должно быть легко адаптироваться к вашим потребностям.
источник
Вы можете использовать класс HashTree, включенный в Apache JMeter, который является частью проекта Jakarta.
Класс HashTree включен в пакет org.apache.jorphan.collections. Хотя этот пакет не выпущен за пределами проекта JMeter, вы можете получить его легко:
1) Загрузите исходники JMeter .
2) Создать новый пакет.
3) Скопируйте на него / src / jorphan / org / apache / jorphan / collection /. Все файлы, кроме Data.java
4) Скопируйте также /src/jorphan/org/apache/jorphan/util/JOrphanUtils.java
5) HashTree готов к использованию.
источник
В Java нет конкретной структуры данных, которая бы соответствовала вашим требованиям. Ваши требования довольно специфичны, и для этого вам нужно разработать собственную структуру данных. Глядя на ваши требования, любой может сказать, что вам нужно некое n-арное дерево с определенными функциями. Вы можете спроектировать свою структуру данных следующим образом:
Я хотел бы предложить, вы пишете структуру узла в одном классе, как Class Node {String value; Перечислите дочерние элементы;} и все другие методы, такие как search, insert и getChildren, в другом классе NodeUtils, чтобы вы также могли передать корень дерева для выполнения операций над определенным деревом, например: class NodeUtils {public static Node search (Node root, String value)) {// выполнить BFS и вернуть Node}
источник
источник
Я написал библиотеку дерева, которая прекрасно работает с Java8 и не имеет других зависимостей. Он также дает свободную интерпретацию некоторых идей из функционального программирования и позволяет отображать / фильтровать / удалять / искать во всем дереве или поддеревьях.
https://github.com/RutledgePaulV/prune
Реализация не делает ничего особенного с индексированием, и я не отошел от рекурсии, поэтому возможно, что при больших деревьях производительность снизится, и вы можете разбить стек. Но если все, что вам нужно, это простое дерево от малой до средней глубины, я думаю, что оно работает достаточно хорошо. Он предоставляет разумное (основанное на значениях) определение равенства, а также имеет реализацию toString, которая позволяет визуализировать дерево!
источник
Пожалуйста, проверьте код ниже, где я использовал древовидные структуры данных, без использования классов Collection. В коде могут быть ошибки / улучшения, но, пожалуйста, используйте это только для справки
источник
Вы можете использовать класс TreeSet в java.util. *. Он работает как дерево двоичного поиска, поэтому он уже отсортирован. Класс TreeSet реализует интерфейсы Iterable, Collection и Set. Вы можете перемещаться по дереву с помощью итератора, как множество.
Вы можете проверить, Java Doc и некоторые другие .
источник
Пользовательская реализация дерева Tree без использования фреймворка Collection. Он содержит различные фундаментальные операции, необходимые для реализации дерева.
источник