Java 泛型比较 |实现比较

标签 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(capture#1-of ?) 不适用于参数 (Comparable) - 行断点:KeyValPair [行:39] -比较(KeyValPair)

编辑2:

更新的代码:

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(capture#2-of ?) 不适用于 参数(可比较)

解决方案:

我通过将 KEYVALPAIR 作为 BST 的内部类并使用 V extends Comparable 解决了这个问题。 现在可以使用了,感谢您的帮助。

最佳答案

您不需要将键或值转换为可比较的,因为 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> 这样的类(class)- 如果它们与 super 类型相当,仍然可以订购。

关于Java 泛型比较 |实现比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20372957/

相关文章:

java - Spring JUnit 测试 - 实例化问题

java - 无法使用 Selenium 获取 WebElement 标签名称

c# - 检查 'T'是否继承或实现了一个类/接口(interface)

java - 欧拉计划 #3 Java

c# - 使用 LINQ 筛选对象列表

Java-声明新的泛型集时出现意外的类型错误

java - 如何在不使用 Node 类的情况下添加到二叉搜索树

algorithm - 在不知道哪个是哪个的情况下打印来自 k 个不同树的排序数字

java - inOrderIterator 方法不能应用于 BinaryTreeNode<T>

java - 当使用外观 session bean 时,为什么我们还应该使用业务 session bean?