¿Hay alguna clase de biblioteca Java estándar para representar un árbol en Java?
Específicamente necesito representar lo siguiente:
- El subárbol en cualquier nodo puede tener un número arbitrario de hijos
- Cada nodo (después de la raíz) y sus hijos tendrán un valor de cadena
- Necesito obtener todos los elementos secundarios (algún tipo de lista o conjunto de cadenas) de un nodo dado y su valor de cadena (es decir, un método que tomará un nodo como entrada y devolverá todos los valores de cadena del nodo secundario como salida)
¿Hay alguna estructura disponible para esto o necesito crear la mía propia (si es así, las sugerencias de implementación serían geniales)?
Respuestas:
Aquí:
Esa es una estructura de árbol básica que se puede usar para
String
cualquier otro objeto. Es bastante fácil implementar árboles simples para hacer lo que necesita.Todo lo que necesita agregar son métodos para agregar, eliminar, atravesar y constructores. El
Node
es el bloque de construcción básico de laTree
.fuente
Tree
clase no es necesaria, porque cada una de ellasNode
puede verse como un árbol.Otra estructura de árbol más:
Uso de la muestra:
BONIFICACIÓN
Ver árbol de pleno derecho con:
https://github.com/gt4dev/yet-another-tree-structure
fuente
hasNext()
antes de cada llamadanext()
para obtener resultados válidos. Esto no es parte de laIterator
especificación.En realidad, hay una estructura de árbol bastante buena implementada en el JDK.
Echa un vistazo a javax.swing.tree , TreeModel y TreeNode . Están diseñados para ser utilizados con el
JTreePanel
pero son, de hecho, una implementación de árbol bastante buena y no hay nada que lo detenga de usarlo sin una interfaz de swing.Tenga en cuenta que a partir de Java 9 es posible que no desee utilizar estas clases, ya que no estarán presentes en los 'Perfiles compactos' .
fuente
¿Qué hay de esto?
fuente
setAsParent
ogetHead
qué hacen y este es el momento en que realmente podría obtener ayuda sobre las estructuras de datos de árbol. Incluso la fuente original del documento no tiene comentarios.Yo escribí una pequeña biblioteca que se encarga de árboles genéricos. Es mucho más ligero que el material de swing. También tengo un proyecto maven para ello.
fuente
Obviamente, puede agregar métodos de utilidad para agregar / eliminar hijos.
fuente
Debe comenzar definiendo qué es un árbol (para el dominio), esto se hace mejor definiendo primero la interfaz . No todas las estructuras de árboles son modificables, poder agregar y eliminar nodos debería ser una característica opcional, por lo que creamos una interfaz adicional para eso.
No hay necesidad de crear objetos de nodo que contengan los valores , de hecho, veo esto como un gran defecto de diseño y sobrecarga en la mayoría de las implementaciones de árbol. Si observa Swing,
TreeModel
está libre de clases de nodos (soloDefaultTreeModel
usaTreeNode
), ya que no son realmente necesarias.Estructura de árbol mutable (permite agregar y eliminar nodos):
Dadas estas interfaces, el código que usa árboles no tiene que preocuparse mucho por cómo se implementa el árbol. Esto le permite utilizar implementaciones genéricas , así como también especializadas , en las que se da cuenta del árbol delegando funciones a otra API.
Ejemplo: estructura de árbol de archivos
Ejemplo: estructura de árbol genérica (basada en relaciones padre / hijo):
fuente
Ninguna respuesta menciona un código demasiado simplificado pero que funciona, así que aquí está:
fuente
Puede usar cualquier API XML de Java como documento y nodo ... ya que XML es una estructura de árbol con cadenas
fuente
Si está haciendo una codificación de pizarra, una entrevista o incluso planea usar un árbol, la verbosidad de estos es un poco demasiado.
Además, debe decirse que la razón por la que un árbol no está allí, como, digamos, un
Pair
(sobre el cual podría decirse lo mismo), es porque debe encapsular sus datos en la clase usándolo, y la implementación más simple se ve así:Eso es todo para un árbol de ancho arbitrario.
Si quería un árbol binario, a menudo es más fácil de usar con campos con nombre:
O si querías un trie:
Ahora dijiste que quieres
Eso suena como tu tarea.
Pero como estoy razonablemente seguro de que ha pasado cualquier fecha límite ...
Esto te hace usar como:
fuente
En la misma línea que la respuesta de Gareth, consulte DefaultMutableTreeNode . No es genérico, pero por lo demás parece encajar. Aunque está en el paquete javax.swing, no depende de ninguna clase de AWT o Swing. De hecho, el código fuente tiene el comentario
// ISSUE: this class depends on nothing in AWT -- move to java.util?
fuente
Hay un par de estructuras de datos de árbol en Java, como DefaultMutableTreeNode en JDK Swing, Tree en el paquete del analizador Stanford y otros códigos de juguetes. Pero ninguno de estos es suficiente pero lo suficientemente pequeño para fines generales.
El proyecto de árbol de Java intenta proporcionar otra estructura de datos de árbol de propósito general en Java. La diferencia entre este y otros son
fuente
Como la pregunta solicita una estructura de datos disponible, se puede construir un árbol a partir de listas o matrices:
instanceof
se puede usar para determinar si un elemento es un subárbol o un nodo terminal.fuente
Object
s serían los objetos hoja (por ejemplo,String
s) o ramas (representados por matrices). Y funciona: ese código se compilará y creará un pequeño árbol deString
s.Tan simple como se pone y muy fácil de usar. Para usarlo, extiéndelo:
fuente
Por ejemplo :
fuente
En el pasado, acabo de usar un mapa anidado para esto. Esto es lo que uso hoy, es muy simple pero se ajusta a mis necesidades. Quizás esto ayude a otro.
fuente
Escribí una pequeña clase "TreeMap" basada en "HashMap" que admite agregar rutas:
Se puede usar para almacenar un árbol de cosas del tipo "T" (genérico), pero (todavía) no admite el almacenamiento de datos adicionales en sus nodos. Si tiene un archivo como este:
Luego puedes convertirlo en un árbol ejecutando:
Y obtendrás un bonito árbol. Debería ser fácil adaptarse a sus necesidades.
fuente
Puedes usar el HashTree clase incluida en Apache JMeter que es parte del Proyecto Jakarta.
La clase HashTree se incluye en el paquete org.apache.jorphan.collections. Aunque este paquete no se publica fuera del proyecto JMeter, puede obtenerlo fácilmente:
1) Descargue las fuentes de JMeter .
2) Crear un nuevo paquete.
3) Copie en él / src / jorphan / org / apache / jorphan / collections /. Todos los archivos excepto Data.java
4) Copie también /src/jorphan/org/apache/jorphan/util/JOrphanUtils.java
5) HashTree está listo para usar.
fuente
No existe una estructura de datos específica en Java que se adapte a sus requisitos. Sus requisitos son bastante específicos y para eso necesita diseñar su propia estructura de datos. Mirando sus requisitos, cualquiera puede decir que necesita algún tipo de árbol n-ary con alguna funcionalidad específica. Puede diseñar su estructura de datos de la siguiente manera:
Sugeriría que escriba la estructura del nodo en una clase como Class Node {String value; Enumere children;} y todos los demás métodos como search, insert y getChildren en otra clase NodeUtils para que también pueda pasar la raíz del árbol para realizar operaciones en un árbol específico como: class NodeUtils {búsqueda de nodo público estático (raíz de nodo, valor de cadena) {// realiza BFS y devuelve el nodo}
fuente
fuente
Escribí una biblioteca de árbol que juega muy bien con Java8 y que no tiene otras dependencias. También proporciona una interpretación flexible de algunas ideas de la programación funcional y le permite mapear / filtrar / podar / buscar en todo el árbol o subárboles.
https://github.com/RutledgePaulV/prune
La implementación no hace nada especial con la indexación y no me alejé de la recursión, por lo que es posible que con árboles grandes el rendimiento se degrade y pueda volar la pila. Pero si todo lo que necesita es un árbol sencillo de profundidad pequeña a moderada, creo que funciona lo suficientemente bien. ¡Proporciona una definición sensata (basada en el valor) de igualdad y también tiene una implementación toString que le permite visualizar el árbol!
fuente
Verifique el código a continuación, donde he usado estructuras de datos de árbol, sin usar clases de colección. El código puede tener errores / mejoras, pero use esto solo como referencia
fuente
Puede usar la clase TreeSet en java.util. *. Funciona como un árbol de búsqueda binario, por lo que ya está ordenado. La clase TreeSet implementa las interfaces Iterable, Collection y Set. Puede atravesar el árbol con un iterador como un conjunto.
Puedes consultar, Java Doc y algunos otros .
fuente
Implementación personalizada de Tree sin utilizar el marco de la Colección. Contiene diferentes operaciones fundamentales necesarias en la implementación de Tree.
fuente