2013-04-29 27 views
15

Betrachten Sie, ich habe Objekt A{int elementA; int elementB}. Diese Objekte werden in einem arraylist, ArrayList<A> listObj gespeichert.Überprüfen Sie, ob Java-Array-Objekt enthält

Wie kann ich durchführen, enthält Operation nur mit Teil des Objekts A Eigenschaften, z. Betrachten Sie nur elementA für das Finden, wenn Objekt newA{elementA} bereits in der Liste ist?

Für Objekt A habe ich gleich definiert, wo ich nur die elementA (Teil des Objekts A), aber das ist nicht genug.

Also wäre es schön, ein paar Ideen zu bekommen, wie kann contains angewendet und für Teile von Objekten verwendet werden? (meine eigene Funktion schreiben ist eine Option, aber interessant, wenn die Standardfunktionalität mit diesem Problem umgehen könnte)

+0

Zeigen Sie Ihre 'equals' Methode. – NINCOMPOOP

+0

Wenn Sie Ihre equals() korrekt überschrieben haben, sollte listObj.contains (new A (elemAvalue)) funktionieren. Beachten Sie, dass Sie hashCode auch nur bei Berücksichtigung von elementA-Wert überschreiben sollten, obwohl dies für dieses Beispiel nicht funktional relevant ist. – misberner

+0

'if (! Tage.enthalten (getDate())) { Tage.add (getDate()); } ' –

Antwort

0

Die hashCode() und equals() Arrays sind ein bisschen kaputt, wenn es darum geht (es ist eine lange andere Diskussion warum).

Eine mögliche Umgehung ist die Verwendung ArrayList<ArrayList<String>> anstelle von ArrayList<String[]>, die equals() -Methode für ArrayList wird sein, 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 wahr ergeben, wie

erwartet

untenstehenden Link

Most efficient way to see if an ArrayList contains an object in Java

21

List#contains() Methode verwendet die equals() Methode Siehe auch das, wenn zwei Objekte zu bewerten sind gleich. 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; 
} 
+0

Dies funktioniert gut, solange Sie die A-Elemente vergleichen müssen, aber sobald sich die Anforderung ändert, können Sie dies wegwerfen, ganz zu schweigen davon, dass Sie vielleicht die equals- oder hashcode-Methoden an anderen Stellen verwenden möchten mit einem Komparator, der sicher ist. –

+2

Fair genug! Aber List 'contains()' verwendet die 'equals' Methode, nicht' Comparable.compareTo() '! – NINCOMPOOP

+0

Danke für die Lösung. Für Neulinge wie mich: Wenn 'ElementA' ist' String' Typ, dann verwenden Sie 'isEqual = (this.ElementA.equals (((A) -Objekt) .ElementA));' –

0

würde ich nicht equals für diese außer Kraft setzen. Auch wenn {1, 1} und {1, 2} nicht beide in Ihrer Liste auftreten können, sind die beiden Objekte nicht gleich.

Ich würde ein verwenden Map statt:

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

Sie könnten Ihre equals anpassen für Ihre Bedürfnisse zu empfangen, sondern auch eine der vielen leistungsstarken integrierten Bibliotheken verwenden könnte, die bereits vorhanden ist, wie commons-collections, Guava oder lambdaj . Sie verfügen alle über Iterations- und Prädikatkonstrukte, mit denen Sie Ihre Sammlungen anhand eines Prädikats "erkunden" können.

Beispiel mit Commons Kollektionen:

boolean contains = CollectionUtils.exists(myArrayList, new Predicate<A>() { 
    public boolean evaluate(A theA) { 
     // Do the comparison 
    } 
}); 
0

der Wille Anzügen obige Lösung Alle Ihre Frage. Was ich Ihnen hier vorschlagen möchte, ist !!! Wann immer Sie die Sammlung verwenden, haben Sie Ihren variablen Datentyp immer in seiner Superklasse. Das wird Ihnen helfen, mehr Manipulation zu machen und zu einer seiner Unterklassen zu konvertieren.

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

Der Vorteil, dass die Umsetzung der Liste kann (zu einem LinkedList zum Beispiel) ändern, ohne den Rest des Codes zu beeinflussen. Dies ist mit einer ArrayList nur schwer möglich, nicht nur, weil Sie ArrayList überall in LinkedList ändern müssen, sondern auch, weil Sie möglicherweise ArrayList-spezifische Methoden verwendet haben.

0

Zum Vergleichen des Objektwerts in arrayList. Folgen Sie diesem Link. How to compare Objects attributes in an ArrayList?

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

+0

10 Dies sollte nicht als Antwort festgelegt werden I denke, aber als Kommentar. – NatNgs

+0

Sie können nicht einfach zu antworten. Sie müssen die Antwort hier geben. –

+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - [Aus Bewertung] (/ review/low-quality-posts/18543188) –

Verwandte Themen