我有一个带有两个类型变量的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)?谢谢你的帮助!
答案 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)
您是否要介绍K
和J
具有您可以使用的自然顺序的要求?在这种情况下,您可以像这样声明您的班级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。