In Java schreef ik een binaire zoekboomklasse die knooppunten toevoegt met behulp van recursie. Nu wil ik het generaliseren met Generics, zodat ik meer over hen kan leren.
public class GBinNode<T> {
T item;
GBinNode<T> left;
GBinNode<T> right;
public GBinNode(T newItem) {
item = newItem;
left = null;
right = null;
}
public GBinNode(T it, GBinNode<T> le, GBinNode<T> ri) {
item = it;
left = le;
right = ri;
}
public String toString() {
return item.toString()+" ";
}
}
Mijn functie om knooppunten toe te voegen is in de volgende klas
public class GBinTree<T extends Comparable <T>> {
GBinNode<T> add(T item, GBinNode<T> bn) {
if (bn==null) {
return new GBinNode<T>(item, null, null);
}
if (item < bn.item) { // ERROR HERE
bn.left = add( item, bn.left);
}
else {
bn.right = add( item, bn.right);
}
return bn;
}
public void toString(GBinNode<T> root) {
GBinNode<T> curr = root;
if (curr == null)
return;
else {
toString(curr.left);
System.out.println(curr.toString()); // inorder traversal
toString(curr.right);
}
}
De hoofdklasse heeft de volgende code om dingen uit te schoppen. Ik gebruik strings, maar het gegevenstype kan een complex type zijn.
GBinTree<String> bt = new GBinTree<String>();
GBinNode<String> root = null;
root = bt.add("Calex", root);
root = bt.add("Ealex", root);
root = bt.add("Balex", root);
root = bt.add("Dalex", root);
bt.toString(root);
Ik begon de Vergelijkbare interface te gebruiken, maar hoe schrijf ik dan de CompareTo() functie? Ik weet niet welk type T zal zijn? De fout die ik kreeg was “De operator < is niet gedefinieerd voor de argumenttype(n) T, T”.
Op zoek naar een oplossing, was een antwoord Generieke typen Java vergelijken:
class Element<T extends Comparable<T>>
Ik begrijp niet waar dit heen moet en hoe het verschilt van de klasse die Comparable implementeert. De enige plaats waar ik het type ken, is in de hoofdklasse, dus zou de CompareTo() daar moeten zijn? Ik heb gekeken om van GBinTree een interface te maken, maar raakte in de war of dat de juiste weg was? Alle hulp wordt op prijs gesteld.
Antwoord 1, autoriteit 100%
Je kunt operators in Java niet overbelasten. De operator <
is alleen van toepassing op primitieve (of numerieke) typen, niet op referentietypen. Aangezien T
een typevariabele is die een referentietype vertegenwoordigt, kunt u <
niet gebruiken voor variabelen van het type T
. Je moet gebruiken
if (item.compareTo(bn.item) < 0)
controleer de geretourneerde waarde en besluit ermee te doen wat u wilt.
Je weet niet wat het type T
zal zijn, maar je weet dat het een type zal zijn dat Comparable
implementeert en daarom de compareTo()
methode.
Antwoord 2, autoriteit 3%
U kunt deze eenvoudige aanpak gebruiken
voor gegevens groter dan root.getData = 1, voor gegevens is gelijk aan root.getData = 0, voor gegevens kleiner dan root.getData = -1
public class BST<E extends Number & Comparable<? super E>>{
void add(){
...
if(data.compareTo(root.getData()) == 1)
...
}