Java Generics Comparable |实现compareTo

时间:2013-12-04 10:34:57

标签: java generics binary-search-tree comparable compareto

我遇到了java泛型的问题。我的计划是使用具有总排序的泛型实现二叉搜索树(键和值)。我首先创建了这个KeyValPair并遇到了获得正确的compareTo方法的问题。

public class KeyValPair <V extends Comparable<V>>
        implements Comparable<KeyValPair<V>>{

    private int key;
    private V value;
    private KeyValPair<V> leftchild;
    private KeyValPair<V> rightchild;

    public KeyValPair(int k,V v){
        key=k;
        value=v;
    }

    public Comparable<?> getKey(){
        return key;
    }

    public Comparable<?> getValue(){
        return value;
    }

    public void setRightChild(KeyValPair<V> r){
        rightchild=r;
    }

    public KeyValPair<V> getRightChild(KeyValPair<V> r){
        return rightchild;
    }

    public void setLeftChild(KeyValPair<V> l){
        leftchild=l;
    }

    public KeyValPair<V> getLeftChild(KeyValPair<V> l){
        return leftchild;
    }

    @Override
    public int compareTo(KeyValPair<V> toComp) {
        if(this.getValue().compareTo(toComp.getValue())>0){
            return -1;
        }else if(this.getValue().compareTo(toComp.getValue())==0){
            return 0;
        }else{
            return 1;
        }
    }

}

compareTo中的if句子没有被加入,我认为这是因为我覆盖了compareTo,但我应该如何比较泛型?

还尝试了Comparable而不是K,结果相同。

最好的问候

编辑:编译器说的是:此行的多个标记 - Comparable类型中的compareTo(捕获#1-of?)方法不适用于参数(可比较) - 行断点:KeyValPair [line:39] - 的compareTo(KeyValPair)

EDIT2:

更新代码:

public class KeyValPair{

private int key;
private Comparable<?> value;
private KeyValPair leftchild;
private KeyValPair rightchild;

public KeyValPair(int k,Comparable<?> v){
    key=k;
    value=v;
}

public Comparable<?> getKey(){
    return key;
}

public Comparable<?> getValue(){
    return value;
}

public void setRightChild(KeyValPair r){
    rightchild=r;
}

public KeyValPair getRightChild(KeyValPair r){
    return rightchild;
}

public void setLeftChild(KeyValPair l){
    leftchild=l;
}

public KeyValPair getLeftChild(KeyValPair l){
    return leftchild;
}

}

现在我更新了KEYVALPAIR的代码,但是如果我用我的BST类和方法加法器测试它作为例子:

private void adder(KeyValPair current,KeyValPair toInsert) {
    if(toInsert.getValue().compareTo(current.getValue())>0){
        //dosomething
    }
}

它抛出: Comparable类型中的compareTo(捕获#2-of?)方法不适用于  参数(可比较)

解决方案:

我通过将KEYVALPAIR作为内部类添加到BST并使用V extends Comparable来解决它。 立即行动,感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

您不需要将键或值转换为可比较的,因为V已经需要具有可比性。这样做会让您更难使用您的课程,因为现在您只有一个Comparable而不是可用的值或键。

public int getKey() {
    return key;
}

public V getValue() {
    return value;
}

@Override
public int compareTo(KeyValPair<V> toComp) {
    return -this.getValue().compareTo(toComp.getValue());
}

您还应考虑放宽V必须实施Comparable<V>

的要求
class KeyValPair<V extends Comparable<? super V>>

允许例如像Apple extends Fruit implements Comparable<Fruit>这样的类 - 如果它们与超类型相当,那么它们仍然可以被订购。

答案 1 :(得分:0)

您的问题是,您需要将V与其他V进行比较,而您对其运行时类型一无所知。

它可以是StringInteger,但您显然不会以相同的方式对它们进行比较。

所以我认为您的KeyValPair不应该实现Comparable,因为其成员(V个实例)已经这样做了:<V extends Comparable<V>>

如果你想进行一些比较,你可以简单地做一些事情:

leftChild.getValue().compareTo(rightChild.getValue());

getValue()也应返回Comparable<V>,不需要通配符。