25

次のようなクラスがあるとします。

class A {
  int elementA;
  int elementB
}

私もArrayListこのようなものを持っています: ArrayList<A> listObj.

のプロパティの一部のみを使用して、そのリストにオブジェクトが含まれているかどうかを確認するにはどうすればよいAですか? たとえば、オブジェクトがすでにリストにあるかどうかelementAを見つけることだけを考えていますか?newA{elementA}

オブジェクトの場合、 のみを考慮するメソッドAを定義しましたが、これでは十分ではありません。equalselementA

4

7 に答える 7

32

List#contains()メソッドは、このequals()メソッドを使用して、2 つのオブジェクトが同じかどうかを評価します。したがって、equals()クラスAでオーバーライドし、hashCode().

@Override
public boolean equals(Object object)
{
    boolean isEqual= false;

    if (object != null && object instanceof A)
    {
        isEqual = (this.elementA == ((A) object).elementA);
    }

    return isEqual;
}

@Override
public int hashCode() {
    return this.elementA;
}
于 2013-04-29T07:33:22.137 に答える
4

ニーズに合わせて調整することもできますが、 commons-collectionsGuavalambdajequalsなど、既存の強力なコレクション ライブラリの 1 つを使用することもできます。それらにはすべて、述語に基づいてコレクションを「探索」できる反復および述語構造があります。

コモンズ コレクションの例:

boolean contains = CollectionUtils.exists(myArrayList, new Predicate<A>() {
    public boolean evaluate(A theA) {
        // Do the comparison
    }
});
于 2013-04-29T07:43:21.957 に答える
1

私はこれをオーバーライドequalsしません。{1, 1}リストに と の両方が出現することはありませ{1, 2}んが、2 つのオブジェクトは等しくありません。

代わりに使用しMapます:

Map<Integer, A> map = new HashMap<>();
A a1 = new A(1, 1);
A a2 = new A(1, 2);

map.put(a1.elementA, a1);

// test if key is contained
boolean contains = map.containsKey(a2.elementA);

// overwrite a1 with a2
map.put(a2.elementA, a2);
于 2013-04-29T07:38:27.817 に答える
0

これに関しては、配列のhashCode()andequals()は少し壊れています (理由については長い別の議論です)。

考えられる回避策は、ArrayList<ArrayList<String>>代わりにを使用ArrayList<String[]>することです。ArrayList の equals() メソッドは、期待どおりになります。

例えば:

   ArrayList<String> l1 = new ArrayList<>();
    ArrayList<String> l2 = new ArrayList<>();
    l1.add("asdf");
    l2.add("asdf");
    ArrayList<ArrayList<String>> coll = new ArrayList<>();
    coll.add(l1);
    System.out.println(coll.contains(l2));

予想通り、真になります

下記リンクも参照

ArrayList に Java のオブジェクトが含まれているかどうかを確認する最も効率的な方法

于 2013-04-29T07:31:39.803 に答える
0
List<Upload> mUploadPost = new ArrayList<Upload>();
Upload upload = new Upload();
upload.addName("Mpendulo");
upload.addLastName("Mtshali");
if(!mUploadPost.contains(upload)){
    mUploadPost.add(upload);
}
于 2019-09-11T00:15:29.283 に答える
0

上記の解決策はすべてあなたの質問に合っています。ここで私があなたに提案したいのは!!! コレクションを使用するときはいつでも、常に変数のデータ型をそのスーパークラスに持ってください。これは、より多くの操作を行い、そのサブクラスに変換するのに役立ちます。

Ex:
List<String> myList = new ArrayList<String>();

コードの残りの部分に影響を与えることなく、List の実装を (たとえば LinkedList に) 変更できるという利点。ArrayList をあらゆる場所で LinkedList に変更する必要があるだけでなく、ArrayList 固有のメソッドを使用している可能性があるため、これを ArrayList で行うのは困難です。

于 2013-05-03T10:17:12.593 に答える