Saltar al contenido principal

Boletín 506. Árbol binario de búsqueda (opcional)

En este boletín implementaremos un árbol binario de búsqueda utilizando el patrón Iterator.

Además, crearemos una librería con esta estructura de datos para poder utilizarla en cualquier proyecto de Java. Veremos cómo incluirla de manera manual y también cómo crear un repositorio en Maven y usarla desde ese repositorio.

Ejercicios

Ejercicio 1. Sigue los siguientes pasos para crear un árbol binario de búsqueda (BST).

  1. Crea la clase ArboreBinariaBusca:
    • Para que el árbol pueda almacenar cualquier tipo de dato, modifica la clase para que contenga una clase genérica T.
    • Debemos crear ahora los atributos:
      • Tendremos el atributo nodo de la clase T para poder almacenar cualquier tipo de objeto.
      • Crea dos atributos de la propia clase, uno para el subárbol izquierdo y otro para el derecho.
    • Crea el método recursivo engadirElemento(T elemento) para añadir un nuevo elemento. Si el atributo nodo es nulo, asigna el elemento al nodo, si no debes decidir si añadirlo al subárbol izquierdo o derecho. Como necesitas comparar elementos, deberías indicar que la clase genérica T tenga implementada la interfaz <Comparable<T>>.
    • Crea el método recursivo List<T> recorridoInOrde() que devuelve una lista con los elementos ordenados de menor a mayor.
  2. Crea la clase Xogador que implemente la interfaz Comparable<Xogador> con las siguientes características para poder probar nuestro Árbol Binario de Búsqueda:
    • Almacenaremos para cada jugador su nombre y dorsal.
    • Crea un constructor con los parámetros anteriores.
    • Documenta el constructor.
    • Crea getters y setters para todos los parámetros.
    • Implementa el método int compareTo(Xogador arg0) que ordene los jugadores según su dorsal.
    • Redefine el método toString() con el formato <dorsal>: <nombre>.
  3. Realiza un programa principal que:
    • Crea un objeto abb de la clase ArboreBinariaBusca.
    • Crea objetos de Xogador con los siguientes datos y añádelos al árbol:
      JugadorDorsal
      Lionel Messi10
      Cristiano Ronaldo7
      Neymar Jr.11
      Kylian Mbappé19
      Zlatan Ibrahimović8
      Robert Lewandowski9
      Sergio Ramos4
      Kevin De Bruyne17
      Mohamed Salah21
      Erling Haaland99
    • Imprime en pantalla la lista de jugadores utilizando el método recorridoInOrde().

Ejercicio 2. Vamos a utilizar el patrón Iterator en nuestra clase que representa un árbol binario de búsqueda.

  1. Crea la clase IteradorABB que implemente la interfaz Iterator<T>:
    • La clase IteradorABB es una clase con tipo genérico, pero este tipo debe tener implementada la interfaz Comparable.
    • Crea un constructor que reciba una ArboreBinariaBusca<T>. Debes almacenar la lista que devuelve recorridoInOrde() en un atributo.
    • Debemos implementar dos métodos:
      • public T next(): devuelve el elemento actual y avanza al siguiente elemento.
      • public boolean hasNext(): indica si hay algún elemento más.
    • Para implementar estos métodos necesitarás un atributo para saber en qué posición te encuentras actualmente de la lista. Implementa los dos métodos.
  2. En la clase ArboreBinariaBusca implementa la interfaz Iterable<T>:
    • Implementa el único método de la interfaz public Iterator<T> iterator() que devolverá un objeto de la clase IteradorABB.
  3. Modifica el programa principal para poder recorrer el árbol directamente utilizando un bucle for each:
    for( Xogador xogador: abb) {
    System.out.println(xogador);
    }

Ejercicio 3. Vamos a crear una librería que contenga las clases del árbol.

  1. Haz una copia de seguridad del código.
  2. Modifica el proyecto del siguiente modo:
    • Elimina la clase Xogador y borra todo el contenido del método main.
    • Crea el paquete arbores y añade a ese paquete las clases IteradorABB y ArboreBinariaBusca.
    • Pulsa F1 en Visual Studio Code y selecciona Java: export jar... y después selecciona <without main class> porque solo queremos exportar las clases IteradorABB y ArboreBinariaBusca.
    • Esto creará un archivo con extensión jar que contendrá nuestras clases compiladas. Solo debemos añadirlo a otros proyectos para poder utilizar estas clases.
  3. Crea un nuevo proyecto:
    • Añade una copia del archivo jar anterior al directorio lib del proyecto.
    • En el programa principal crea un objeto ArboreBinariaBusca de String.
    • Añade solo los nombres de los jugadores de la tabla anterior y con for...each puedes recorrerlos para imprimirlos.

Ejercicio 4: Vamos a crear un repositorio Maven para poder usarlo para nuestras librerías. Se recomienda usar Debian.

  1. Vamos a crear un repositorio en Maven en un servidor para poder acceder desde cualquier equipo a nuestras librerías.
    • Instala Docker y Docker Compose. (En los equipos del centro ya está instalado)
    • Instala la extensión de Docker en Visual Studio Code.
    • Crea el archivo docker-compose.yaml en un directorio con el siguiente contenido para crear un servidor de repositorios con Nexus:
      services:
      nexus:
      image: sonatype/nexus3
      volumes:
      - "nexus-data:/nexus-data"
      ports:
      - "8081:8081"

      volumes:
      nexus-data: {}
    • Sitúate en una terminal en el directorio donde tienes el archivo anterior y ejecuta docker compose up.
    • Ve a la extensión de VSC de Docker, pincha en el contenedor que se creó y pulsa en Attach shell y se abrirá una consola dentro del contenedor.
    • Ejecuta el comando cat /nexus-data/admin.password para obtener la contraseña de Nexus.
    • Entra en el navegador web en localhost:8081 para acceder a la interfaz web de Nexus e inicia sesión con el usuario admin y la contraseña obtenida en el paso anterior.
    • Cambia la contraseña por abc123. y activa el uso anónimo.
    • Ve a Ajustes (tiene un icono de engranaje) y después a Repository > Repositories y pulsa en Create repository para crear un repositorio.
    • Selecciona maven2(hosted) para que sea un repositorio Maven. Ponle de nombre prog.
    • Pulsa el botón a la izquierda de Ajustes y ve a Browse y selecciona el repositorio creado.
    • Sube el jar creado en el ejercicio 2 y completa la siguiente info:
      • Extension: jar
      • Group ID: arbores
      • Artifact ID: Arbores
      • Version: 1
      • Activa: Generate a POM file with these coordinates
    • Pulsa en Upload y ya tendremos incluida nuestra librería en el repositorio Maven propio.
  2. Vamos a probar nuestro repositorio Maven:
    • Crea un proyecto en Maven.
    • En el archivo pom.xml añade las siguientes líneas para indicar que use nuestro repositorio:
      <repositories>
      <repository>
      <id>prog</id>
      <name>prog</name>
      <url>http://localhost:8081/repository/prog/</url>
      </repository>
      </repositories>
    • Además, añade en el repositorio la librería de los árboles binarios de búsqueda:
      <dependencies>
      <dependency>
      <groupId>arbores</groupId>
      <artifactId>Arbores</artifactId>
      <version>1.0</version>
      </dependency>
      </dependencies>
    • En el programa principal crea un objeto ArboreBinariaBusca de String.
    • Añade solo los nombres de los jugadores de la tabla anterior y con for...each puedes recorrerlos para imprimirlos.