比较两个通用对象的问题

时间:2011-05-06 01:16:13

标签: java comparison binary-search-tree

我的项目是使用BSTree<E>的电话簿。树的每个节点都是BTNode<E>。在主类中,当我定义节点时,我将I替换为具有(String name, String number)的Pair类。

我有以下比较器类来比较2种E类型:

import java.util.Comparator;

public class BTNodeComparator<E> implements Comparator<E>
{
    public int compare(E a, E b) throws ClassCastException
    {
        return ((Comparable<E>) a).compareTo(b);
    }
}

我在BSTree<E>中使用它。

现在,当我运行程序并进入比较器时,它会给我比较器的错误,因为现在它在两个对之间进行比较

我该如何解决这个问题?我想要的是比较两对的名字吗?

对不起我的错误解释。我的英语很弱。

=========================

编辑:

@Tim:尝试解决方案后,它给了我这个错误:

java.lang.NullPointerException
    at Pair.compareTo(Pair.java:36) // @ return name.compareTo(pair.getName());
    at Pair.compareTo(Pair.java:2)  // @ public class Pair implements Comparable<Pair>
    at BTNodeComparator.compare(BTNodeComparator.java:24) // @ return (a.compareTo(b));
    at BTNodeComparator.compare(BTNodeComparator.java:20) // @ public class BTNodeComparator<E extends Comparable<E>> implements Comparator<E>
    at BSTree.search(BSTree.java:285)
    at BSTree.insert(BSTree.java:300)
    at PhoneBook.main(PhoneBook.java:25)

BTW,我在BSTree中删除了BTNodeComparator如下:

protected Comparator<E> c = new BTNodeComparator();
if (c.compare(target, cursor.getElement()) < 0) cursor = cursor.getLeft();

1 个答案:

答案 0 :(得分:2)

我能看到的唯一可能的失败是ClassCastException。 要修复代码,您需要指定Pair类,如下所示:

class Pair implements Comparable<Pair> {
    String name;
    String number;

    //some implementation stuff...

    @Override
    public int compareTo(Pair o) {
        return name.compareTo(o.name);
    }
}

通常,如果您的Comparator实现依赖于实现Comparable的泛型类型,那么您应该像这样指定它:

public class BTNodeComparator<E extends Comparable<E>> implements Comparator<E> {
    public int compare(final E a, final E b) {
        return a.compareTo(b);
    }
}

这样做只会在不改变Comparator工作方式的语义的情况下为您提供编译时安全性。

根据您的评论,我猜您将BTNodeComparator嵌入到BSTree类中作为嵌套的内部类,这意味着您可能无法在不更改类型的情况下进行更改BSTree声明中的定义。