我正在尝试在java中实现自定义排序二进制树,并且我在比较时遇到了一些问题。我正在尝试实现一个通用树,所以我想做类似的事情:
public boolean contains(int i){
if(i == currentNode.value)
return true;
else if (i > currentNode.value)
// Go right
else if (i < currentNode.value)
// Go left
...
}
但我正在使用对象(我假设它们是可以比较的对象),所以我想做类似的事情:
public boolean contains(Object o){
if(o == currentNode.value) // value is of Object class
return true;
else if (o > currentNode.value) // Problem
// Go right
...
}
所以我现在的问题是不可能使用运算符&gt;和&lt;对象,到目前为止,我一直无法想到另一种方法。
答案 0 :(得分:1)
如果您使用任何Object
,请覆盖equals()
方法,以进行相等性检查。如果您想比较它们,请实施Comparable
界面,或为其创建Comparator
。
这个答案不会详细解释,如何使用它们,请阅读文档(它们非常详细,并给你一个良好的开端,关于用法),或搜索例如用法,互联网上充满了它们。
答案 1 :(得分:1)
在java中实现Comparable的对象将有一个名为compareTo的方法,它返回一个整数。你只需要做你的&gt;和&lt;测试,即:
int res = comparable.compareTo(other);
if(res == 0){
return true;
} else if(res > 0){
//go right
...
} else {
//go left
...
}
答案 2 :(得分:1)
对象本身不具有可比性,是苹果大于橙色吗?可比较的对象实现接口Comparable
。因此,简单的答案是用Comparable替换二叉树中的Object
的每个实例并具有
int comparison = o.compareTo(currentNode.Value)
if(comparison ==0){
...
} else if (comparison > 0) {
...
} else {
// comparison < 0
...
}
您可能想了解java泛型,这使您的代码更加类型安全。 你会这样开始
public class BinaryTree<T extends Comparable> {
public boolean contains(T target) {
....
}
...
}
然后你可以像
一样使用它BinaryTree<Integer> tree = ...
tree.add(1);
tree.add(2);
tree.add("three"); // <-- Syntax error, compiler would fail.
...
Integer first = tree.getFirst();
Integer last = tree.getLast();
答案 3 :(得分:0)
这正是java可比较和泛型的用途!
您的对象应该实现:“int compareTo(Object obj)”方法。如果您正在创建二进制搜索树,则您的contains方法将类似于:
public class MyTree<T extends Comparable<T>>{
...
public boolean contains(TreeNode<T> node, T target)(
if(node == null) return false;
if(node.data.equals(target)){
return true;
}
if(node.data.compareTo(target) > 0){//node is greater than target go left
return contains(node.left, target);
}else{
return contains(node.right, target)//node is less than target go right
}
}
}