我想在节点中生成一个带键值对的二叉树。
在我的二叉树中,我想在开头使用insert
方法实现节点,如果密钥小于当前节点的密钥,则实现新的左节点。然后,如果已经有一个左节点,它将再次检查它。右/大节点插入遵循相同的逻辑。
我首先使用int
类型编写了代码,因为在我使用泛型之前,我更容易测试代码(对我来说是新主题)。它在使用int
时有效,但我不确定如何使用"<"来比较两个泛型。或">"。
public ListCell<Type> checkKey(Type key, ListCell<Type> checkCell) {
ListCell<Type> newCell = null;
if (key < checkCell.key && checkCell.left != null) {
...
}
...
}
我不知道它是否值得说,但我正在使用自编码列表创建我的二叉树。 上面你可以看到我目前的支票,但我现在无法将我的给定密钥与checkCell.key进行比较,因为它们不是数字。
所以我的一般性问题如何比较泛型中的键,如果它们是&#34;更小&#34;或者&#34;更大&#34;我在二叉树中的实现比另一个。
提前致谢
答案 0 :(得分:8)
您需要确保您的泛型类型实现了Comparable
接口,然后使用compareTo
方法。 Java不支持重载>
运算符(或者任何运算符重载)。
根据the documents,compareTo
:
返回负整数,零或正整数,因为此对象小于,等于或大于指定对象。
一个示例(您必须映射到确切的代码),假设key
是您将存储在节点中的项目,checkCell.key
是您的节点
int compareResult = key.compareTo(checkCell.key);
if (key < 0) { // it goes on the left }
else if (key == 0) { // it is the same }
else { // it goes on the right }
在compareTo
方法中,您需要确定班级中的哪些字段确定它是“订购”。例如,如果您有size
和priority
字段,则可以执行以下操作:
@Override public int compareTo(Type other) {
final int BEFORE = -1;
final int EQUAL = 0;
final int AFTER = 1;
if (this == other) return EQUAL;
if (this.size < other.size) return BEFORE;
else if (this.size > other.size) return AFTER;
else { // size is equal, so test priority
if (this.priority < other.priority) return BEFORE;
else if (this.priority > other.priority) return AFTER;
}
return EQUAL;
}
答案 1 :(得分:3)
有界类型参数是通用算法实现的关键。请考虑以下方法,该方法计算数组T []中大于指定元素elem的元素数。
public static <T> int countGreaterThan(T[] anArray, T elem) {
int count = 0;
for (T e : anArray)
if (e > elem) // compiler error
++count;
return count;
}
该方法的实现很简单,但它不能编译,因为大于运算符(&gt;)仅适用于基本类型,如short,int,double,long,float,byte和char。你不能使用&gt;运算符来比较对象。要解决此问题,请使用由Comparable<T>
接口限定的类型参数:
public interface Comparable<T> {
public int compareTo(T o);
}
结果代码为:
public static <T extends Comparable<T>> int countGreaterThan(T[] anArray, T elem) {
int count = 0;
for (T e : anArray)
if (e.compareTo(elem) > 0)
++count;
return count;
}