创建compareTo到实现Comparable的泛型类

时间:2011-02-16 08:06:55

标签: java generics interface comparable

我有一个带有两个类型变量的Generic Class,它实现了java.lang.Comparable。

public class DoubleKey<K,J> implements Comparable<DoubleKey<K,J>>{

    private K key1;
    private J key2;

    public DoubleKey(K key1, J key2){
        this.key1 = key1;
        this.key2 = key2;
    } 

    public K getFirstKey(){
        return this.key1;
    }

    public J getSecondKey(){
        return this.key2;
    }

    // need for Comparable interface
    public int compareTo(DoubleKey<K,J> aThat){
        ...
    }

}

因为我用Comparable实现它,我需要编写compareTo()方法。因为K,J可以是 ANY 类型,所以我在如何完全比较它们方面遇到了问题。有没有办法能够在比较中捕获所有可能的类型(Primitive,Wrapper,Object)?谢谢你的帮助!

6 个答案:

答案 0 :(得分:12)

所以总结一下上面说的并将它拼凑成一个工作代码,这是:

    public class DoubleKey<K extends Comparable<K>, J extends Comparable<J>>
        implements Comparable<DoubleKey<K, J>> {

    private K key1;
    private J key2;

    public DoubleKey(K key1, J key2) {
        this.key1 = key1;
        this.key2 = key2;
    }

    public K getFirstKey() {
        return this.key1;
    }

    public J getSecondKey() {
        return this.key2;
    }

    public int compareTo(DoubleKey<K, J> that) {

        int cmp = this.getFirstKey().compareTo(that.getFirstKey());
        if (cmp == 0)
            cmp = this.getSecondKey().compareTo(that.getSecondKey());
        return cmp;
    }
}

答案 1 :(得分:8)

您是否要介绍KJ具有您可以使用的自然顺序的要求?在这种情况下,您可以像这样声明您的班级DoubleKey

class DoubleKey<K extends Comparable<K>, J extends Comparable<J>>

然后,您可以根据需要定义DoubleKey的compareTo。你可以这样做:

getFirstKey().compareTo(aThat.getFirstKey())

但是,您无法将K的任何实例与J的实例进行比较。没有为这些类型定义排序。

如果这些类型不一定具有自然顺序(许多不具有),则可以将Comparator<K>Comparator<J>作为参数添加到DoubleKey的构造函数中。已经可以用作示例的类是Google Guava的优秀Maps类(具体参见newTreeMap方法及其接受的类型的范围)。

答案 2 :(得分:4)

public class DoubleKey<
        K implements Comparable<K>, 
        J implements Comparable<J>> 
    implements Comparable<DoubleKey<K,J>> {

    public int compareTo(DoubleKey<K,J> that){
        int cmp = this.key1.compareTo(that.key1);
        if(cmp==0) cmp = this.key2.compareTo(that.key2);
        return cmp;
    }
}

答案 3 :(得分:0)

DoubleKey<K,J>小于,大于或等于此值时,您必须定义规则。这就是比较的结果。也许,这是我的实际猜测,与DoubleKey<K,J>的实例进行比较没有多大意义。

如果您没有实际关注 如何订购,只需要实施任何订购,请尝试以下方法:

public int compareTo(DoubleKey<K,J> that){
    // real codes needs checks for null values!
    return (this.key1.toString() + this.key2.toString()).compareTo(that.key1.toString() + that.key2.toString());
}

答案 4 :(得分:0)

第一种方式:使用hashCodes,比如

 public int compareTo(DoubleKey<K,J> aThat){
     getFirstKey().hashCode() + getSecondKey().hashCode() - aThat.getFirstKey().hashCode() +   aThat.getSecondKey().hashCode();
 }

(你应该多考虑一下公式)

第二种方式: 将比较器添加到构造函数

public DoubleKey(K key1, J key2, Comparator cmp){

答案 5 :(得分:0)

通常情况下,存在一个可以解决问题的库:Apache Commons lang3。我经常使用Pair<L,R>个实例作为键。他们实现了Comparable。