5

Comparator のような Equalator メカニズムはありますか?

編集:私の目標は、現在の list1.equals(list2) を区別することです。これは、浅いコピーであるか、すべてのオブジェクト a.equals(b) を含むディープ コピーであるかをチェックし、単純な浅いコピーであるかどうかをチェックする list1.identical(list2) を区別することです。変更されていないリスト

これらのリストはすべて同じモデルのものです。同じオブジェクトへのポインターを保持するように自分自身のコピーであるものもあれば、階層が完全に複製されるディープ コピーであるものもあります。これは、構造だけでなく内容が更新されているためです。

私はしばしば list1.equals(list2) を作成していますが、両方が TOTAL コピー (コレクションの同じ順序で同じオブジェクト) であるか、場合によってはそれらが LOGICAL コピーであるか (独自に実装された論理 equals を介して) を伝えるメカニズムが必要なので、リストします。 equals を呼び出し、オブジェクトは a==b 以上のものを実装する必要があります。

私の問題は、Equalator インターフェイスがないことです。オブジェクトをオーバーライドすると、TOTAL EQUAL (a==b) で比較する機能が失われます。

たとえば、これはいいでしょう。

Collections.equal(l1,l2,new Equalator(){
    @Override public boolean equals(Obj1,Obj2){
          //Default lists comparison plus commparison of objects based on
          return (obj1.propertyX() == obj2.propertyX());
    }
});

それでも list1.equals(list2) を実行できるので、デフォルトの equals (obj1==obj2) を使用します。これは、含まれているオブジェクトがまったく同じである場合にのみ当てはまります。

最初の操作は、リスト (モデルから完全に再作成されたオブジェクトを含む更新されたリストである可能性があります) がまだ古いリストと等しいかどうかを確認するのに役立ちます。

2 番目の操作は、リスト (データ モデルの古い現在のバージョンの浅いコピー) をチェックするのに役立ちます。これには、更新されたバージョンのときにコード内で移動することによる超越的な変更が含まれていません。

編集:非常に良い例は、Point(x,y) のリストを持つことです。両方のリストがまったく同じポイントのセットであるため等しいか、それらに含まれるポイントが論理的に等しいため等しいかを知ることができるはずです。phyEqual と logEqual の両方をオブジェクトに実装し、任意のオブジェクトに両方のメソッドを含めることができる場合、 list.phyEqual(list2) または list1.logEqual(list2)

4

2 に答える 2

2

遅い答えですが、誰かにとって役立つかもしれません...

Guava Equivalenceクラスは、比較のための Comparator と同等であることは同じです。リストを比較するための独自のメソッドを作成する必要があります (Guava ではサポートされていません) が、このメソッドをさまざまな等価定義で呼び出すことができます。

または、独自のインターフェイスをロールすることもできます。

interface Equalator<T> {
    boolean equals(T o1, T o2);
}

繰り返しますが、(簡単な) メソッドを記述する必要があります

boolean <T> listEquals(List<T> list1, List<T> list2, Equalator<T> equalator) {
    ...  
}

...しかし、別の ListEqualator 実装で再利用できます。

于 2013-02-26T20:58:47.150 に答える
2

あなたの質問は、少なくとも私にははっきりとはわかりません。これで適切に答えられない場合は、少し言い直していただけますか?

特定の Collection 具象型内では、ほとんどの equals 実装が既にヒントを実行しています。例えば:

    public boolean equals(Object o) {
        if (o == this)
            return true;

この場合、このようなことは理にかなっているかもしれません。
これは簡単にオーバーライドできます。

    @Override
    public boolean equals(Object o) {
        if (o.getPrimaryKey() == this.getPrimaryKey()) 
            return true;
        return super().equals(o);

[null のテストを追加する必要があります] 標準コレクションを作成している場合は、構築中に equals メソッドを匿名でオーバーライドすることもできます。

これでうまくいかない場合は、コレクションを自分で拡張し、そこにあるメソッドをオーバーライドして同様のことを行うことができます。

それは役に立ちますか?

于 2012-08-01T11:52:29.840 に答える