20

java.lang.Comparable を実装する 2 つの型変数を持つジェネリック クラスがあります。

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

    秘密 K キー 1;
    プライベート J キー 2;

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

    public K getFirstKey(){
        this.key1 を返します。
    }

    public J getSecondKey(){
        this.key2 を返します。
    }

    // Comparable インターフェイスが必要
    public int compareTo(DoubleKey<K,J> aThat){
        ...
    }

}

Comparable で実装したので、compareTo() メソッドを記述する必要があります。K、J は任意の型になる可能性があるため、それらを完全に比較する方法に問題があります。比較ですべての可能なタイプ (プリミティブ、ラッパー、オブジェクト) をキャッチできる方法はありますか? 助けてくれてありがとう!

4

6 に答える 6

13

したがって、上記を要約し、それをパズルとして機能するコードにまとめると、次のようになります。

    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;
    }
}
于 2013-07-04T08:28:35.123 に答える
8

要件を導入し、K使用Jできる自然な順序付けを導入しますか? この場合、次のDoubleKeyようにクラスを宣言できます。

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

その後、DoubleKeycompareToを好きなように定義できます。次のようなことができます。

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

Kただし、 のインスタンスを のインスタンスと比較することはできませんJ。これらの型に対して定義された順序はありません。

例として使用できる、既にこれを行っているクラスは、Google Guava の優れたMapsクラスです (具体的には、メソッドとそれらが受け入れる型の境界を参照してください)。Comparator<K>Comparator<J>DoubleKeynewTreeMap

于 2011-02-16T08:16:50.263 に答える
4
public class DoubleKey<
        K は Comparable<K> を実装し、
        J は Comparable<J>> を実装します
    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);
        cmpを返します。
    }
}
于 2011-02-16T08:16:18.467 に答える
0

よくあることですが、問題を解決できるライブラリが存在します: Apache Commons lang3。私はよくPair<L,R>インスタンスをキーとして使用します。彼らは Comparable を実装しています。

于 2013-08-13T07:30:58.457 に答える
0

aがこれよりも小さい、大きい、または等しい場合のルールを定義する必要があります。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());
}
于 2011-02-16T08:15:22.790 に答える
0

最初の方法: のように、hashCodes を使用します。

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

(式についてもっと考えるべきです)

2 番目の方法: コンストラクターにコンパレーターを追加する

public DoubleKey(K key1, J key2, Comparator cmp){
于 2011-02-16T08:16:18.190 に答える