HashSet

HashSet - Java - Programmation

Marsh Posté le 22-05-2007 à 15:06:07    

Bonjour  :hello:  
 
Voila mon probleme :  
je dispose d'un Arraylist d'objet "Site", un Site contenant plusieurs parametres dont le code NAF (un string).
Lors de la création de ce tableau, je souhaite récuperer toute les modalités differente de ce code NAF (faire l'équivalent d'un "Select distinct" en SQL)
Pour cela j'utilise donc un HashSet.
Ca marche correctement lorsque que dans mon HashSet je met juste le code Naf.
Et cela ne fonctionne pas quand j'essaye d'inserer un objet "Type" contenant le code Naf. Ca m'affiche des doublons.
 
voila mon code :
 

Code :
  1. ...
  2. HashSet test = new HashSet();
  3. HashSet test2 = new HashSet();
  4. ...
  5.   while (ligne_lu!=null ){
  6.    StringTokenizer T = new StringTokenizer(ligne_lu, "\t" );
  7.    String naf = T.nextToken();
  8.             int x = Integer.parseInt(T.nextToken());
  9.             int y = Integer.parseInt(T.nextToken());
  10.            
  11.             Site site = new Site(naf,x,y);
  12.             les_sites.ajouterUnSite(site);
  13.            
  14.             Type type = new Type(naf);
  15.             test.add(naf);      // La ca marche nickel
  16.             test2.add(type);    // La ca ne marche plus, j'ai des doublons
  17.            
  18.    ligne_lu = Br.readLine();
  19.   }


 
Ma classe Type :
 

Code :
  1. public class Type {
  2. private String NAF; // code NAF
  3. // private int Na=0;   // Na : Somme des sites de meme type
  4. //Constructeur
  5. public Type(String naf) {
  6.  NAF = naf;
  7. }
  8. public Type() {
  9. }
  10. // Méthode
  11. public void afficher(){
  12.  System.out.println("Type : "+ getNAF());
  13. }
  14. // Accesseurs et Mutateurs
  15. public String getNAF() {
  16.  return NAF;
  17. }
  18. public void setNAF(String naf) {
  19.  NAF = naf;
  20. }
  21. }


 
Voila, je ne sais pas comment faire autrement à part bidouller à partir du HashSet "test"
Merci de m'aider car suis pas sur d'avoir bien compris le fonctionnement des HashSet ( et pis de Java en géneral  :sweat: ).

Reply

Marsh Posté le 22-05-2007 à 15:06:07   

Reply

Marsh Posté le 22-05-2007 à 15:14:27    

J'ai vu qu'on pouvait également déclarer un HashSet comme ceci :
 
HahSet <Type> test2 = new HashSet <Type>();
 
mais j'ai alors les erreurs suivante :
 
HahSet cannot be resolved to a type
Syntax error, parameterized types are only available if source level is 5.0
The type HashSet is not generic; it cannot be parameterized with arguments <Type>  
 
 
 

Reply

Marsh Posté le 22-05-2007 à 15:26:55    

Ouais faut écrire HashSet au lieu de Hahset surement :o
et apparemment tu es pas en Java5 donc t'as pas droit aux générics ?

Reply

Marsh Posté le 22-05-2007 à 15:44:54    

did-54 a écrit :

Ouais faut écrire HashSet au lieu de Hahset surement :o
et apparemment tu es pas en Java5 donc t'as pas droit aux générics ?

 

Pour le HahSet, c'est juste une faute de copier coller

 

pour le Java5, j'en sais rien du tout, j'y connais strictement rien, j'ai juste installer eclipse car il parais que c'est plus sympa que le notepad.
Effectivement, ca l'est  :o
Nos profs d'info nous apprennent rarement les truc utiles du genre "C'est quoi une library ...  :sweat: "

 


Cela dis, pour mon probleme, aparement il faudrait que je redefinisse la méthode HashCode et equals :sweat:


Message édité par fusion_sadam le 22-05-2007 à 15:46:15
Reply

Marsh Posté le 03-06-2007 à 22:06:01    

bonsoir  
dans ton HashSet test = new HashSet(); tu jaoutes des Objet String
dans HashSet test2 = new HashSet(); des object Type
Du coup lors de l'ajout de ces objet dans la HashSet java compare les objets via la méthode équals et hashcode (Set est collection a objet unique d'ou le test equal, et hashSet est renforcé par une table de hash)
chaque élément ajouté, recherché ou supprimé font appel à ces méthodes pour calculer le code de hachage des objets et les comparer entre eux. (equals() et hashCode())  
Donc redéfinir ces deux méthodes dans ta classe Type

Reply

Sujets relatifs:

Leave a Replay

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