1

いくつかのモデル オブジェクトを含む 2 つの arraylist があります。これらの arraylist の違いを見つけたいです。モデルの代わりに文字列を使用すると、コレクション フレームワークの removeall 関数で違いがわかりました。ただし、モデル オブジェクトの場合は機能しません。誰か助けてください

4

4 に答える 4

9

equalsandをカスタム オブジェクトに実装すると、shashCodeで行ったのと同じアプローチを使用できますString

于 2012-06-20T10:38:41.120 に答える
0

2 つの ArraList を比較するには、2 つのオブジェクトを比較する必要があります。あなたの場合、それはモデル オブジェクトであるため、equals メソッドをオーバーライドする必要があります。このコードを試してください @Override public boolean equals(Object compareObj) { if (this == compareObj) return true;

    if (compareObj == null) 
        return false;

    if (!(compareObj instanceof MyModel)) 
        return false;

    MyModel model = (MyModel)compareObj; 

    return this.name.equals(model.name); // Are they equal?
    }

    @Override
    public int hashCode()
    {
    int primeNumber = 31;
    return primeNumber + this.name.hashCode();
        return 0;
    }
于 2012-06-21T05:14:54.927 に答える
0

StringクラスはすでにメソッドのバージョンをオーバーライドしているためequalshashCodeメソッドを使用できますremove()。コレクションでクラスを使用する必要がある場合は、クラスで (List or Set)これらのメソッドをオーバーライドする必要があります。そうしないと、これらのメソッドのデフォルトの実装が使用されます。

2 つのオブジェクトが論理的に等しい場合、それらhashCodeは等しい必要があり、equals() を満たす必要があることを意味します。

于 2012-06-20T10:47:19.970 に答える
0

メソッドは、モデル クラスについて何もremoveAll知らない汎用ライブラリ メソッドです。では、少し考えてみると、どれが「同じ」かをどのように判断するのでしょうか?

簡単な答えは、クラスのメソッドをオーバーライドequals()する必要があるということですModel。これがチェックの基になっているためです。実装は、同じと見なしたいモデル インスタンスのペアに対して true を返す必要があります。デフォルトの継承された動作は、それらがメモリ内の同じオブジェクトである場合にのみ true を返します。(そしていつものように、オーバーライドするときはオーバーライドequals()する必要もありhashCode()ます)。

于 2012-06-20T10:39:55.037 に答える