Comparer des objets dans LinkedList.contains ()
Je veux être en mesure d'avoir LinkedList.contains() retourne true pour une mesure de comparaison.
Supposons que j'ai 1 LinkedList et 2 objets
LinkedList<MyObject> myList = new LinkedList<MyObject>();
MyObject a = new MyObject("HELLO");
MyObject b = new MyObject("HELLO");
Techniquement, les deux objets sont identiques en termes de comparaison (MyObject implémente Comparable)
( a == b ) == true
cependant, quand je fais la suite, maliste ne retourne pas vrai pour myList.contient(b)
myList.add(a)
myList.contains(b) //== false
Je pense que c'est parce contient vérifier la référence d'objet et de voir que a et b sont 2 objets distincts.
Est-il possible que je peux le faire donc je n'ai pas d'étendre LinkedList pour comparer ces objets?
source d'informationauteur Eric
Vous devez vous connecter pour publier un commentaire.
LinkedList utilise la méthode equals, n'est pas Comparable.compareTo. Vous devriez remplacer equals (et hashCode) dans MyObject pour résoudre le problème.
La
contains()
méthode utiliseequals()
pour déterminer si un objet est dans la liste. Je soupçonne votre classeMyObject
ne remplace pas leequals()
méthode, et ce sera pourquoimyList.contains(b)
est de retourfalse
.Vous devez remplacer la .equals(Oject) et l' .hashCode() méthodes dans le MyObject classe (hashCode n'est pas nécessaire pour la Liste... mais quand vous overrite égale le contrat dit que vous avez à redéfinir hashCode).
Essentiellement ce qui la contient n'est-ce:
Prendre un coup d'oeil à la documentation de l'Objet (par equals et hashCode) ici
Aussi un très bon livre à lire est Efficace Java
Vouliez-vous dire
a.equals(b)
etb.equals(a)
retourtrue
? C'est pas la même qu'une vérification de référence de l'égalité, ni un chèque dea.compareTo(b) == 0
.LinkedList.contains()
utiliseequals()
de sorte que vous avez à faire en sorte que la méthode a été mis en œuvre correctement.equals()
devrait également être compatible aveccompareTo()
si ce n'est pas strictement nécessaire. Si vous utilisez une base de hachage structure de données (par exemple,HashSet
), vous devez vous assurer quehashCode()
est mis en œuvre correctement.La documentation de la méthode contains est comme suit:
Par conséquent, vous devez remplacer la Monobjet est equals(Object o) de la méthode.
Donc, pour votre exemple:
Vous n'avez pas besoin de mettre en œuvre quoi que ce soit avec l'interface Comparable.
Plutôt que d'utiliser une LinkedList à la recherche par le biais de chaque élément, Avez-vous songé à l'aide d'un new HashSet(Comparateur). Cela permettra de comparer efficacement les éléments pour trouver une correspondance.