簡體   English   中英

Java Generics Comparable | 實現compareTo

[英]Java Generics Comparable | implement 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?)方法不適用於參數(Comparable)

解:

我通過將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>這樣的類Apple extends Fruit implements Comparable<Fruit> - 如果它們可以與超類型相媲美,那么仍然可以訂購。

您的問題是,您需要將V與其他V進行比較,並且您對其運行時類型沒有任何想法。

它可以是StringInteger ,你顯然不會以同樣的方式比較它們。

所以我認為你的KeyValPair不應該實現Comparable因為它的成員( V實例)已經這樣做了: <V extends Comparable<V>>

如果你想進行一些比較,你可以簡單地做一些事情:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM