我面临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 [line:39]-compareTo(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的代码,但是如果我使用带有方法adder的BST类对其进行测试,例如:
private void adder(KeyValPair current,KeyValPair toInsert) {
if(toInsert.getValue().compareTo(current.getValue())>0){
//dosomething
}
}
它抛出:
Comparable类型的compareComp(capture#2-of?)方法不适用于
参数(可比)
解:
我通过将KEYVALPAIR作为BST的内部类并使用V扩展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>
这样的类-如果它们与超类型相当,则仍可以排序。关于java - Java泛型可比实现compareTo,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20372957/