pb d'utilisation table de hashage

pb d'utilisation table de hashage - Java - Programmation

Marsh Posté le 25-10-2005 à 12:25:53    

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?
 
 

Reply

Marsh Posté le 25-10-2005 à 12:25:53   

Reply

Marsh Posté le 25-10-2005 à 13:59:46    

Personne aurait une petite idée?

Reply

Marsh Posté le 25-10-2005 à 14:11:59    

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,

Reply

Marsh Posté le 25-10-2005 à 14:51:14    

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 ?

Reply

Marsh Posté le 25-10-2005 à 15:24:13    

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?
 

Reply

Marsh Posté le 25-10-2005 à 15:33:55    

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
Reply

Marsh Posté le 25-10-2005 à 15:44:13    

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

Reply

Sujets relatifs:

Leave a Replay

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