En supposant que j'ai classe comme ça:
class A {
int elementA;
int elementB
}
J'ai aussi une ArrayList
comme ceci: ArrayList<A> listObj
.
Comment vérifier si cette liste contient un objet en n'utilisant que certaines des propriétés de A
? Par exemple. considérer uniquement elementA
pour rechercher si l'objet newA{elementA}
est déjà dans la liste?
Pour l'objet A
, j'ai défini une méthode equals
, où je considère uniquement la elementA
, mais cela ne suffit pas.
La liste # contient () méthode utilise la méthode equals()
pour évaluer si deux objets sont identiques. Donc, vous devez remplacer equals()
dans votre classe A
et également remplacer la 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;
}
Vous pouvez adapter votre equals
à vos besoins, mais vous pouvez aussi utiliser l’une des puissantes bibliothèques de collections existantes, telle que commons-collections , Guava ou lambdaj . Ils ont tous des constructions d'itération et de prédicat qui vous permettent "d'explorer" vos collections en fonction d'un prédicat.
Exemple avec des collections communes:
boolean contains = CollectionUtils.exists(myArrayList, new Predicate<A>() {
public boolean evaluate(A theA) {
// Do the comparison
}
});
Je ne remplacerais pas equals
pour cela. Même si {1, 1}
et {1, 2}
ne peuvent pas figurer tous les deux dans votre liste, les deux objets sont pas égaux.
Je voudrais utiliser un Map
à la place:
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);
Pour comparer la valeur de l’objet dans arrayList
. Suivez ce lien . Comment comparer les attributs d’objets dans une ArrayList?
J'espère que cette solution vous aidera . Merci
Les hashCode()
et equals()
des tableaux sont un peu cassés à ce sujet (c'est une longue discussion différente sur le pourquoi).
Une solution possible consiste à utiliser ArrayList<ArrayList<String>>
au lieu de ArrayList<String[]>
. La méthode equals () pour ArrayList sera celle que vous attendez.
Par exemple:
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));
Rendra vrai, comme prévu
Voir aussi le lien ci-dessous
Le moyen le plus efficace de voir si ArrayList contient un objet en Java
Toute la solution ci-dessus conviendra à votre question. Ce que je voudrais vous suggérer ici est !!! Lorsque vous utilisez une collection, ayez toujours votre type de données variable dans sa super classe. ce qui vous aidera à faire plus de manipulation et à convertir en une de ses sous-classe.
Ex:
List<String> myList = new ArrayList<String>();
L'avantage que l'implémentation de la liste peut changer (en une liste liée par exemple), sans affecter le reste du code. Cela sera difficile à faire avec un ArrayList, non seulement parce que vous devrez changer ArrayList en LinkedList partout, mais aussi parce que vous avez peut-être utilisé des méthodes spécifiques à ArrayList.