Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1145 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  pb d'utilisation table de hashage

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

pb d'utilisation table de hashage

n°1230340
nicolasf
Posté le 25-10-2005 à 12:25:53  profilanswer
 

Slt,  
tout d'abord je tien a signaler que j'ai bien fait une recherche préalable sur ce sujet et que j'ai trouvé un post tres bien fait sur le sujet par benou  http://forum.hardware.fr/hardwaref [...] 3486-1.htm,
mais j'ai quand meme un probleme sur le redefinition de la classe equals(), et j'aurais donc besoin d'un petit coup de main.
 
Pour vous resumer mon prgm, j'ai la classe Parametre suivante ou je redefinis hashCode() et equals()

Citation :


public class Parameter
{  
        // ATTRIBUTS
 private String mnemo;      
   private String syntax;
   private String access;
   private String status;    
   private String descr;
   private String oid;
   private String equipment;
   private MibValueSymbol [] enum;
   private String community;
 
 
  public int hashCode(){
   return this.enum.length;
  }
   
  public boolean equals(Object o){
                  System.out.println("compare = " + this.mnemo);    
                  System.out.println("comparant = " +((Parameter) o).mnemo);
                  if(o instanceof Parameter){
                            // Test sur this.enum et ((Parameter) o).enum pour savoir si egalité
                              return true;
                  }
                  return false;      
  }    
}


 
et une autre classe WriteToExcel ou j'utilise une table de hashage ayant comme clé une instance de Parametre.
J'ai dans cette classe les attributs et la fonction suivante :

Citation :

 
  // ATTRIBUTS
  private HSSFWorkbook [] wb ;
  private HSSFSheet [] sheet;
  private HSSFRow [] row;  
  private HSSFCell [] cell;
  private Vector enumSheet;
  private Hashtable table;
   
  // CONSTRUCTOR
  public WriteToExcel(String [] files) throws IOException{
    this.enumSheet = new Vector();    
    this.openFiles(files);
    this.getBackSheets();
    this.getBackRows();
    this.getBackCells();
    this.table = new Hashtable(10);      
  }
 
public String fillEnumSheet (Parameter p){  
    String name2 = (String)this.table.get(p);
     if(name2 == null){    // Le parametre n'est pas present dans la table
                  int taille = this.enumSheet.size();
                 name2 = "Enum " + taille;        
                 this.table.put(p, name2);           //Ajout du parametre dans la table  
                 //CREATE NEW SHEET  
                  // ...
                 // ADD THE NEW SHEET                
                 // ...            
     }  
     return name2;            
}


 
Le probleme que j'ai c'est que la methode equals() redefinie dans la classe parametre renvoie toujours true.
J'ai donc fait un affichage au debut de cette fonction et je me rends compte qu'en fait elle compare le parametre p de (String)this.table.get(p) a lui meme et non pas aux autres parametres de la table de hashage ayant le meme hashCode().
Donc chaque fois que je teste si le parametre est dans la table il me renvoie true des qu'un parametre de meme hashcode est deja present, a cause de la fonction equals qui renvoie toujours true.
 
Est-ce que qq'un saurait d'ou vient le pb?
 
 

mood
Publicité
Posté le 25-10-2005 à 12:25:53  profilanswer
 

n°1230412
nicolasf
Posté le 25-10-2005 à 13:59:46  profilanswer
 

Personne aurait une petite idée?

n°1230440
Rickou
Posté le 25-10-2005 à 14:11:59  profilanswer
 

bonjour,
 
tres rapidement, je peux te conseiller de jeter un coup d'oeil a http://www.philippe.prados.name/La [...] equals.pdf pour connaitre les liens entre equals et hashcode.
 
bonne journee,

n°1230514
benou
Posté le 25-10-2005 à 14:51:14  profilanswer
 

bha tu respectes pas le contrat entre hashcode et equals : si dont A.equals(B), A.hashCode() doit être égal à B.hashCode(). Si tu ne respecte pas cette contrainte, ca va faire n'importe quoi quand tu vas utiliser cet objet en tant que clef d'une Map (et autres classes se basant sur un algo de hash).
 
Sinon ta méthode hashCode() a l'air aussi bizare que ta méthode equals ... Est ce que tu as vraiment compris à quoi elles servent ces méthodes ?

n°1230538
nicolasf
Posté le 25-10-2005 à 15:24:13  profilanswer
 

je crois avoir compris.
Dis moi si je me trompe :
Quand tu fais un get(clef) , la methode hashCode que tu as redéfinie génère un int a partir de la clef et va voir dans un vecteur l'ensemble des objets stockés dans ta table correspondant a cet int.
Ensuite avec la methode equals, ça vérifie si un de ces objets est égal a ta clef (egal dans le sens redefini par ta methode  equals).
Est-ce que c'est ça ou bien j'ai rien compris?
 

n°1230549
phnatomass
Je m'empare de ton esprit !!
Posté le 25-10-2005 à 15:33:55  profilanswer
 

Code :
  1. System.out.println("comparant = " +((Parameter) o).mnemo);
  2. if(o instanceof Parameter){
  3.    // Test sur this.enum et ((Parameter) o).enum pour savoir si egalité


C'est un peu abusé quand même


Message édité par phnatomass le 25-10-2005 à 15:34:26
n°1230560
nicolasf
Posté le 25-10-2005 à 15:44:13  profilanswer
 

benou a écrit :

bha tu respectes pas le contrat entre hashcode et equals : si dont A.equals(B), A.hashCode() doit être égal à B.hashCode().  


 
En fait je remet la methods equals en entier, je l'avais tronquée parce (je pense) qu'en fait le pb ne vient pas de ce que j'ai mis dans la fonction ,mais de l'appel a la fonction elle meme.
Sinon j'ai bien  A.equals(B) implique A.hashCode() ==  B.hashCode() puisque dans la methode equals() je fais un test sur la taille de A et B, ce qui est justement ce que retourne mon hashCode().
 

Citation :

 
public boolean equals(Object o){
    System.out.println("compare = " + this.mnemo);    
    System.out.println("comparant = " +((Parameter) o).mnemo);
    if(o instanceof Parameter){
      if( (((Parameter) o).enum!=null) && (this.enum!=null) ){
        if( (((Parameter) o).enum.length == this.enum.length) ){
          int num = this.enum.length;
          for (int i=0; i<num; i++){
                       if(!(((Parameter)o).enum[i].getValue().toObject().toString().equals(    
                         enum[i].getValue().toObject().toString()))  
                          &&(((Parameter) o).enum[i].getName().equals(enum[i].getName())) ){                                                      return false;
                        }
          }          
          return true;
        }
      }
    }
    return false;      
  }  


 
Si je dis que je pense que le probleme vient de lappel et pas de la fonction elle meme c'est parce que sur l'affichage que je fais au debut, le comparant et le comparé sont identique.
J'espere avoir été plus clair


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  pb d'utilisation table de hashage

 

Sujets relatifs
Probleme ecriture sur table attaché AS400Utilisation de fonts non installés
[SQL] ALTER TABLE sur table liée ?? ou solution de contournement plz ?[MPatrol] Problème d'utilisation de mpatrol sous windows avec dev c++
[VBS] Utilisation de cacls[CSS] utilisation du symbole *
Mettre le nom d'une table en paramètre dans un script SqlLister les colonnes d'une table
Insérer fichier dans table sql[POSTGRES] Défragmenter une table?
Plus de sujets relatifs à : pb d'utilisation table de hashage


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR