¿Qué significa <K extiende comparables > en Java en el contexto de hacer árboles de búsqueda binarios?

El árbol de clases (usemos convenciones de nomenclatura de Java) contiene métodos abstractos, por lo que es una clase abstracta.

El hecho de que utilice las anotaciones K y V puede recuperar una estructura de árbol que puede contener pares , como un TreeMap (Java Platform SE 7)

De todos modos, creo que esto no es importante.

Los 2 puntos a enfocar aquí son:

  • Tipos genéricos de Java Tipos genéricos (Tutoriales de Java ™> Aprendizaje del lenguaje Java> Genéricos (actualizados)): su firma requiere que sus clases de árbol contengan elementos de un tipo genérico K (que debe tener alguna característica que analizaremos en el punto 2) ;

Entonces, si asumimos que no cometió un error tipográfico, las firmas NonEmpyTree y EmptyTree deberían ser

clase abstracta pública NonEmptyTree <K extiende Comparable > {
}

clase abstracta pública EmptyTree <K extiende Comparable > {
}

  • Interfaces en evolución: puede ampliar una interfaz existente para agregar nuevos métodos, sin afectar las implementaciones antiguas. En su caso, necesita que K sea ​​un tipo que implemente una interfaz que amplíe (evolucione) la interfaz Comparable . Por esta razón, podría ser un tipo que implemente Comparable o una interfaz como la siguiente

interfaz pública MyComparable extiende el Comparador {
public bool addictionalMethod ();
}

que evoluciona che Comparator interfaz agregando, por ejemplo, un método.

El hecho de que deba almacenar en su Árbol un tipo comparable es porque los elementos en su árbol deben ordenarse de acuerdo con el orden que defina haciendo que K implemente una interfaz Comparable (en el ejemplo, My interfaz Comparable es una interfaz Comparable ).

Significa que alguien dejó un error tipográfico, porque debería ser BinarySearchTree> . La razón por la que necesita esta restricción es porque los BST dependen de que los datos tengan un orden natural, por lo que puede saber qué valores vienen antes o después de otros, y eso es lo que nos brinda la interfaz Comparable . Luego tomamos algún valor aproximadamente en el medio, que es la raíz del árbol, y verificamos si el valor que estamos buscando es menor o mayor. Luego continuamos recursivamente hacia abajo en el árbol, dividiendo el intervalo de búsqueda aproximadamente a la mitad, hasta que finalmente llegamos al valor de búsqueda o terminamos en un árbol vacío.

Java tiene esa característica genial llamada genéricos. Significa que si tiene una clase de contenedor (por ejemplo, MyArray) puede aplicarla a cada tipo de objeto contenido.

Asumiendo que MyArray regular se ve así:

clase MyArray {
valores privados int [];

}

, entonces la versión general (que se aplica a cada tipo, no solo int) será

clase MyArray {
valores privados de T [];

}

Cada ‘int’ en el básico se reemplaza por ‘T’ (‘T’ es mi elección como abreviatura de “Tipo”, puede ser cualquier cosa)

Le permite manejar un número infinito de casos usando una sola clase.

Ahora, es posible que desee realizar algunas operaciones en objetos de ese tipo. ¡El problema es que no sabes nada al respecto! Podría ser Persona, Punto, Polígono, incluso ArrayList. Usted (y el compilador) no sabe qué métodos están disponibles para ese T.

Aquí viene la palabra clave ‘extiende’. ‘Comparable’ es algo en Java llamado interfaz. Básicamente es un montón de declaraciones de métodos. Esta interfaz específica contiene la declaración:

public int compareTo (V otro).

Cuando declara su Árbol para ‘K extiende Comparable ‘, declara que cualquier tipo que actúe como su ‘K’ (igual que mi T) debe tener ese método compareTo, que es esencial para mantener un BST.

Pasó a ser un poco largo: / espero haber ayudado 🙂

Es una restricción importante sobre el tipo de elementos del árbol. Significa que los tipos que usa para los elementos deben implementar la interfaz Comparable * para los valores de tipo V. Esto es una consideración cuando diseña la clase K.

En palabras más simples, no puede construir un árbol (ordenado) con elementos que no se puedan comparar entre sí.

* —Comparable (Java Platform SE 7)