比较类Object的变量

时间:2014-10-15 20:59:26

标签: java data-structures

我正在尝试在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;对象,到目前为止,我一直无法想到另一种方法。

4 个答案:

答案 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
            }
    }
}