реализация compareTo (Comparable) для бинарного дерева (Generic)
Я создаю двоичное дерево с узлами ключ - значение.
Это работает следующим образом:
Порядок следующий: Если вы реализуете новый узел, вы даете ключ и значение (не важно), он будет проверять, есть ли уже узел, если нет, он создаст его как первый узел. теперь он проверяет, меньше ли ключ, чем ключ первого узла, если да, то он будет помещать его в качестве левого узла, если его еще нет, если он есть, то он повторит это и проверит его снова. То же самое для больший ключ / правый узел. Если ключ равен ключу текущего узла, он будет переопределять узел.
Этот метод работает, если я использую что-то вроде int. Теперь я хочу сделать это как универсальный, поэтому я хочу добавить compareTo из сопоставимого интерфейса, потому что я мог бы проверить, является ли ключ меньше, равен или больше, чем ключ текущего узла. Я знаю, что мне нужно использовать ключи, но я не могу сам кодировать какой-либо метод compareTo. Я не знаю, как заставить его работать.
@Override
public int compareTo(TreeNode<Type> node) {
//method
}
Атрибуты В настоящее время я использую в своей программе: Узлы(первый,предыдущий,левый,правый), ключ, значение Ключ типа, значение Узел myNodes (предыдущий,...)
Определения классов:
public class Tree<Type> {
...
public class TreeNode<Type extends Comparable<Type>>{
...
}
public int compareTo(TreeNode<Type> Node){
//method
}
}
2 ответа:
Прямо сейчас ваш код говорит следующее:
Существует дерево типаtype
, которое можно сравнить с другими деревьями типаtype
.То, что вы, по-видимому, хотите сказать:
Существует дерево, построенное из элементов типаtype
, которые сопоставимы со своим собственным типом.В этом случае вы должны определить дерево следующим образом:
public class Tree<T extends Comparable<T>> { private class TreeNode<F extends<Comparable<F>> implements Comparable<TreeNode<F>>{ private F f; ... public F getF(){return this.f;} @Override public int compareTo(TreeNode<F> node){ return this.f.compareTo(node.getF()); } } //Use TreeNode<T> here ... }
Краткий итог: у вас есть
Tree
типаT
, который является типом, который может быть по сравнению с другими объектами типаT
. Элементы в дереве представленыTreeNode<T>
, которые можно сравнить с другимиTreeNode<T>
. Сравнение aTreeNode<T>
С aTreeNode<T>
может быть выполнено путем сравнения элементов, хранящихся внутриTreeNode
. Есть причина, по которой я отклонился от вашего первоначального замысла в последнем пункте (по крайней мере, по названию). Если вы думаете оT
как о сохраненном элементе, то проще подумать о том, как расширить дерево для поддержки элемента типа TreeItem, что позволяет построить ассоциативную структуру данных поверх дерево.Edit (в прямом ответе, поскольку ОП запросил разъяснение):
Код OP был примерно таким в момент ответа:
public class Tree<T> implements Comparable<Tree<T>>{ ... TreeNode<???>{...}
}
Подумайте о том, что
TreeNode
имеет фиксированный членint key;
на секунду. Вы хотите построитьTree
: поэтому вам нужноTreeNode
s, которые можно сравнить друг с другом (т. е.TreeNode implements Comparable<TreeNode>
), чтобы построитьTree
. Вы реализуете compareTo сint
- сравнениями. Теперь у вас есть неродовойTree
.Чтобы иметь возможность сделать
Tree
generic, вам нужен genericTreeNode
. Таким образом, вы делаетеTreeNode
универсальным и заменяете ранее фиксированное полеint key;
наF f;
. Теперь вы больше не можете реализовать сравнение, основанное на int-сравнениях, поэтомуTreeNode
должен быть каким-то образом сопоставим с другими экземплярамиTreeNode
. Было бы здорово, если бы мы могли делегировать это функции сравненияF
. Чтобы убедиться, что это работает, тип должен бытьTreeNode<F extends Comparable<F>>
. Конечно, нам все еще нужна основная гипотеза сопоставимыхTreeNode
s, чтобы вы в конечном итоге получилиТеперь у вас есть общий
class TreeNode<F extends<Comparable<F>> implements Comparable<TreeNode<F>>
.TreeNode<F>
, который можно сравнить с другими экземплярамиTreeNode<F>
.Теперь вы можете построить общий
Tree<T>
из этих узлов, пока T является чем-то, что можно сравнить с другимиT
s, поэтомуTree<T extends Comparable<T>>
. Поскольку вы не хотите затенять тип внутреннего класса, вы различаете T и F и создаете экземплярTreeNode<T>
s, когда используете их внутри функций дерева. СуществованиеF
не видно извне.