wake-up-neo.com

Prüfen Sie, ob eine ArrayList ein bestimmtes Objekt enthält

Angenommen, ich habe eine Klasse wie diese:

class A {
  int elementA;
  int elementB
}

Ich habe auch eine ArrayList wie folgt: ArrayList<A> listObj.

Wie kann ich überprüfen, ob diese Liste ein Objekt enthält, das nur einige der Eigenschaften von A verwendet? Z.B. Berücksichtigen Sie nur elementA, um herauszufinden, ob Objekt newA{elementA} bereits in der Liste enthalten ist.

Für das Objekt A habe ich eine equals-Methode definiert, bei der ich nur die elementA betrachte, dies reicht jedoch nicht aus. 

17
Saulius S

List # contains () Methode verwendet die Methode equals(), um auszuwerten, ob zwei Objekte gleich sind. Sie müssen also equals() in Ihrer Klasse A überschreiben und auch die hashCode() überschreiben.

@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;
}
23
NINCOMPOOP

Sie können Ihre equals an Ihre Bedürfnisse anpassen, aber Sie können auch eine der mächtigen Sammlungsbibliotheken verwenden, die bereits vorhanden ist, wie commons-collection , Guava oder lambdaj . Sie verfügen alle über Iterations- und Prädikatkonstrukte, mit denen Sie Ihre Sammlungen anhand eines Prädikats "untersuchen" können. 

Beispiel mit Commons-Sammlungen:

boolean contains = CollectionUtils.exists(myArrayList, new Predicate<A>() {
    public boolean evaluate(A theA) {
        // Do the comparison
    }
});
3
NilsH
List<Upload> mUploadPost = new ArrayList<Upload>();
Upload upload = new Upload();
upload.addName("Mpendulo");
upload.addLastName("Mtshali");
if(!mUploadPost.contains(upload)){
    mUploadPost.add(upload);
}
0
Mpendulo

Ich würde equals dafür nicht überschreiben. Obwohl {1, 1} und {1, 2} nicht beide in Ihrer Liste vorkommen können, sind die beiden Objekte nicht gleich.

Ich würde stattdessen eine Map verwenden:

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);

Um den Objektwert in arrayList..__ zu vergleichen, folgen Sie diesem Link . Wie werden Objektattribute in einer ArrayList verglichen?

Ich hoffe, dass diese Lösung Ihnen helfen wird. Danke

0
Aman Goyal

Die hashCode() und equals() der Arrays sind in dieser Hinsicht etwas kaputt (es ist eine lange andere Diskussion, warum).

Eine mögliche Problemumgehung besteht darin, ArrayList<ArrayList<String>> anstelle von ArrayList<String[]> zu verwenden. Die equals () -Methode für ArrayList ist so, wie Sie es erwarten.

Zum Beispiel:

   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));

Wird wie erwartet wahr sein

Siehe auch weiter unten

Der effizienteste Weg, um zu sehen, ob eine ArrayList ein Objekt in Java enthält

0
Hariharan

Alle oben genannten Lösungen werden zu Ihrer Frage passen. Was ich Ihnen hier vorschlagen möchte, ist !!! Wenn Sie Collection verwenden, sollten Sie Ihren variablen Datentyp immer auf die Oberklasse setzen. Dies wird Ihnen helfen, mehr Manipulationen vorzunehmen und in eine beliebige Unterklasse zu konvertieren.

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

Der Vorteil, dass die Implementierung der Liste geändert werden kann (z. B. in eine LinkedList), ohne dass der Rest des Codes beeinträchtigt wird. Dies ist mit einer ArrayList schwer zu bewerkstelligen, nicht nur, weil Sie ArrayList überall in LinkedList ändern müssen, sondern auch, weil Sie möglicherweise ArrayList-spezifische Methoden verwendet haben.

0
user2346260