Besoin d'aide sur méthode contains de la class Collection

Besoin d'aide sur méthode contains de la class Collection - Java - Programmation

Marsh Posté le 18-05-2005 à 14:13:08    

Bonjour,
 
j'ai un petit soucis avec la méthode contains de la class Collection.
 
Voici l'exemple :
 
Collection legende = new ArrayList();
  RefTableItem item1 = new RefTableItem("CODE1","Mon code 1" );
  RefTableItem item2 = new RefTableItem("CODE2","Mon code 2" );
  RefTableItem item3 = new RefTableItem("CODE3","Mon code 3" );
legende.add(item1);legende.add(item2);legende.add(item3);legende.add(item4);
  legende.add(item5);legende.add(item6);legende.add(item7);
 
RefTableItem itemSearch = new RefTableItem("CODE2","Mon code 2" );
 
if (legende.contains((RefTableItem)itemSearch))
{
  System.out.println("Trouvé" );  
}
else
{
 System.out.println("Non trouvé" );
}
 
Et systématiquement mon élément itemSearch n'est pas trouvé dans la Collection legende. Pourquoi ?  :??:  
 
D'avance merci pour votre aide.


Message édité par tafkap le 18-05-2005 à 14:35:27
Reply

Marsh Posté le 18-05-2005 à 14:13:08   

Reply

Marsh Posté le 18-05-2005 à 14:21:47    

je crois que t'as oublié d'ajouter les items à ta Collection...

Reply

Marsh Posté le 18-05-2005 à 14:35:13    

Gloups j'avais oublié de recopier l'ajout dans la collection. C'est réparé. Mais le problème reste le même ;)

Reply

Marsh Posté le 18-05-2005 à 14:40:39    

as tu redefini la methode equals heritee de Object ?

Reply

Marsh Posté le 18-05-2005 à 14:43:14    

re
je ne vois pas trop pourquoi ça bug,
par contre cette ligne de code me parait bizzare
 

Code :
  1. if (legende.contains((RefTableItem)itemSearch))


 
Pourquoi forcer la conversion de itemSearch en RefTableItem alors qu'il est déjà du type RefTableItem ?
 
Essaye de faire  

Code :
  1. if (legende.contains(itemSearch))


 
on sait jamais  :p

Reply

Marsh Posté le 18-05-2005 à 14:57:58    

Non je n'ai pas redéfinie la méthode equals et pour la ligne bizarre c'était un test, au cas où :) le résultat est le même :(
 
Allez allez, encore des idées :) :)

Reply

Marsh Posté le 18-05-2005 à 15:03:23    

désolé mais la ché pas  :(  
c bizzare quoi  :pt1cable:

Reply

Marsh Posté le 18-05-2005 à 15:11:20    

et je suis sûr que legende.contains(item2) renvoie true.
 
 
tu n'as pas défini la méthode equals() dans la classe RefTableItem et donc il utilise la technique par défaut qui est l'identité.
 
je te laisse aller consulter la documentation ou le tutorial poru écrire cet méthode.
 
par contre, pour que ça marche, il faut redéfinir hashCode() en fonction de equals(), et comme tu n'as probablment pas le niveau, je te la donne :

Code :
  1. public int hashCode() {
  2.   return code.hashCode() + description.hashCode();
  3. }


Message édité par nraynaud le 18-05-2005 à 15:11:44

---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 18-05-2005 à 15:48:07    

nraynaud a écrit :

et je suis sûr que legende.contains(item2) renvoie true.
}[/cpp]


C'est à dire que mon code devrait fonctionner tel quel ? merci pour les infos de hashCode(), je regarde ça pour améliorer mon niveau ;)

Reply

Marsh Posté le 18-05-2005 à 15:51:18    

tafkap a écrit :

C'est à dire que mon code devrait fonctionner tel quel ?


non :o


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 18-05-2005 à 15:51:18   

Reply

Marsh Posté le 18-05-2005 à 16:39:29    

Ok alors ça veut dire quoi cette phrase : "et je suis sûr que legende.contains(item2) renvoie true." ???

Reply

Marsh Posté le 18-05-2005 à 16:43:29    

c'est parce que le equals() par défaut compare l'identité et non l'égalité structurelle.
 
Je t'ai dit d'aller dans un tutorial sur equals(), l'as-tu fait ? Je soupçonne que non.


Message édité par nraynaud le 18-05-2005 à 16:43:44

---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 18-05-2005 à 16:46:18    

Non je ne l'ai pas fait, pas encore, mais je vais suivre ton précieux conseil, je me posais la question précédente car en fait ça me retourne false.

Reply

Marsh Posté le 19-05-2005 à 07:12:25    

nraynaud a écrit :


par contre, pour que ça marche, il faut redéfinir hashCode() en fonction de equals


je suis d'accord avec toi que c'est plus prudent, mais là, avec une ArrayList, y a pas besoin... C'est seulement nécessaire quand un algo de hashage est utilisé. Avec un HashSet par exemple ce serait nécessaire.


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 19-05-2005 à 09:56:52    

benou a écrit :

je suis d'accord avec toi que c'est plus prudent, mais là, avec une ArrayList, y a pas besoin... C'est seulement nécessaire quand un algo de hashage est utilisé. Avec un HashSet par exemple ce serait nécessaire.


parce que tu crois qu'ailleur dans son système il ne va pas hacher son truc ?
vlà le bug indémerdable si son binôme est pas au courant qu'il a pas remis le hashCode dans l'axe du equals.
 
d'ailleur tous les outils de vérification font des warning là-dessus.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 19-05-2005 à 14:48:38    

nraynaud a écrit :

parce que tu crois qu'ailleur dans son système il ne va pas hacher son truc ?
vlà le bug indémerdable si son binôme est pas au courant qu'il a pas remis le hashCode dans l'axe du equals.


je suis d'accord. je précisais juste que LA (!!!!!!) le hashcode ne serait pas utilisé, contrairement à ce que ton post laissait croire ...
Je suis d'accord qu'il faut redéfinir l'une quand on définit l'autre.


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 21-05-2005 à 15:46:41    

Salut,
 
dites, vous auriez pas un bon tuto sous la main ?  :jap:

Reply

Marsh Posté le 21-05-2005 à 23:07:29    

Reply

Marsh Posté le 22-05-2005 à 18:30:54    

Merci benou ;) ;)

Reply

Marsh Posté le 23-05-2005 à 11:39:20    

Bon c'est ok j'ai tout compris, j'ai bien redéfini mon equals et mon hashCode, ça fonctionne parfaitement.
 
Merci à tous.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed