/** * Ce programme sert à montrer l'utilisation de Hashtable * Vous devez compléter les parties manquantes, signalées * par <À COMPLÉTER> * @author Philippe Langlais (le codage de l'exemple) * @author Mohamed Lokbani (exo en lui même + les explications) * @version 1.2 */ import java.util.*; // ------------------------------------------------------- // une classe de travail // ------------------------------------------------------- class Personne { private int age; private String nom, prenom; /* <À COMPLÉTER> il existe un algorithme par défaut pour associer à chaque objet (ici Personne) une clé de hashage. pour ce qui suit, vous allez définir un nouveau algorithme pour calculer la clé de hashage de "Personne" comme suit: 11 x le code de hashage du nom de la personne + 13 x le code de hashage du prénom de la personne + age de la personne écrire donc la méthode hashCode de personne qui repose sur le précédent algorithme. */ public int hashCode() { return (11 * nom.hashCode()) + (13 * prenom.hashCode()) + age; } /* <À COMPLÉTER> dès que la méthode hashCode a été redéfinie, il faudra redéfinir la méthode equals ... la méthode equals est définie au sens mathématique i.e. si Objetc1 = Object2 (ce dernier est passé en argument) elle retourne true sinon false. écrire la méthode equals pour la classe Personne. */ public boolean equals(Object o) { if (o instanceof Personne) return (this.prenom.equals(((Personne)o).prenom)) && (this.nom.equals(((Personne) o).nom)) && (this.age == ((Personne) o).age); return false; } public Personne(String prenom, String nom, int age) { this.nom = nom; this.prenom = prenom; this.age = age; } public String toString() {return prenom + " " + nom + " age: " + age;} } // ------------------------------------------------------- // voici la classe principale // ------------------------------------------------------- public class HashTableTest { static String epicerie [] = { "abricot","banane","carotte","date","fenouille", "grenade","haricot","jujube","lentilles","myrtilles", "olive","poire","pomme","reglisse","tilleul" }; public static void main( String args [] ) { Hashtable ht = new Hashtable (); String old; Object objetRef; /* <À COMPLÉTER> ajouter les éléments de épicerie dans une table de hashage ht comme suit: clé: le produit ex. abricot valeur: un entier 0 à taille de épicerie ex. abricot 0 banane 1 ; tilleul 14 */ for (int i=0; i ajouter l'élément suivant à ht: clé: abricot ; valeur: 50 prend la place des xxxxxxxxxxxxxxxxxx if ( (objetRef = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx) != null ) System.out.println("abricot existait deja dans la table au prix de " + objetRef ); */ if ( (objetRef = ht.put("abricot", new Integer(50))) != null ) System.out.println("abricot existait deja dans la table au prix de " + objetRef ); afficheHashTable(ht); /* <À COMPLÉTER> acceder à l'élément: banane prend la place des xxxxxxxxxxxxxxxxxx objetRef = xxxxxxxxxxxxxxx; */ objetRef = ht.get("banane"); if (objetRef == null) System.out.println("banane n'est pas dans la table"); else System.out.println("banane " + objetRef); /* <À COMPLÉTER> retirer l'élément: carotte prend la place des xxxxxxxxxxxxxxxxxx if ( (objetRef = xxxxxxxxxxxxxxxxx) == null) System.out.println("carotte n'est pas dans la table"); else System.out.println("retrait de carotte " + objetRef); */ if ( (objetRef = ht.remove("carotte")) == null) System.out.println("carotte n'est pas dans la table"); else System.out.println("retrait de carotte " + objetRef); /* <À COMPLÉTER> afficher la taille de ht. prend la place des xxxxxxxxxxxxxxxxxx System.out.println("taille = " + xxxxxxxxxxxxxxx); */ System.out.println("taille = " + ht.size()); /* <À COMPLÉTER> afficher la clé et le code de hashage prennent la place des xxxxxxxxxxxx for (int i=0; i Que signifie l'instruction suivante ... // je prevois qu'il y aura autours de 100 entrees */ Hashtable hash = new Hashtable(151); /* <À COMPLÉTER> instancier les objets suivantes du type Personne: elianne1 : prénom: elianne nom: tremblay age:32 elianne2 : prénom: elianne nom: tremblay age:32 brigitte prénom: brigitte nom: simard age:33 */ Personne elianne1 = new Personne("elianne","tremblay",32); Personne elianne2 = new Personne("elianne","tremblay",32); Personne brigitte = new Personne("brigitte","Simard",33); /* <À COMPLÉTER> ajouter elianne1, elianne2 et brigitte dans la table de hashage avec les valeurs suivantes: elianne1 : valeur: 23.5 elianne2 : valeur: 40.5 brigitte valeur: 10.0 */ hash.put(elianne1, new Double(23.5)); hash.put(elianne2, new Double(40.5)); hash.put(brigitte, new Double(10.0)); /* <À COMPLÉTER> afficher la taille de hash. prend la place des xxxxxxxxxxxxxxxxxx System.out.println("taille " + xxxxxxxxxxxxxxx); */ /* Pour afficher la taille, hash.size() va se baser sur la méthode equal. Deux cas se présente: - La méthode equal n'a pas été redéfinie: La méthode equal compare les valeurs des références et non pas les contenus des objets référencés. De ce fait, hash.size() devra donner 3 comme résultat: elianne1,elianne2,brigitte même si en réalité elianne1 & elianne2 contiennent les mêmes informations. - La méthode equal a été redéfinie (comme dans cet exemple): dans ce cas le résultat sera 2, car : elianne1: "elianne","tremblay",32 elianne2: "elianne","tremblay",32 la méthode equal de la classe Personne va retourner dans ce cas "true" pour signifier que les deux objets elianne1 & elianne2 contiennent les mêmes informations, ce qui est le cas, même si les références sont différentes. */ System.out.println("taille " + hash.size()); // le secret du hashage /* redéfinir equals() => redéfinir aussi hashCode() parceque: deux objets égaux par equals() doivent avoir la même valeur de hachage par hashCode() */ System.out.println(elianne1 + " " + elianne1.hashCode()); System.out.println(elianne2 + " " + elianne2.hashCode()); System.exit(0); } // ------------------------------------------------------- // notez a l'execution l'ordre des elements // ------------------------------------------------------- static void afficheHashTable(Hashtable h) { /* <À COMPLÉTER> vous devez les informations relatives à une table donnée: Dump: [clé,valeur][clé,valeur][clé,valeur] ... [clé,valeur](taille_de_h elements) Pour le faire, vous devez utiliser les "outils" de la classe "Enumeration". */ Enumeration enumKey = h.keys(); Enumeration enumInfo = h.elements(); System.out.print("Dump: "); while (enumKey.hasMoreElements() && enumInfo.hasMoreElements()) System.out.print("[" + enumKey.nextElement() + "," + enumInfo.nextElement() + "] "); System.out.println(" (" + h.size() + " elements)"); } } /* lokbani>inclure jdk lokbani>javac HashTableTest.java lokbani>java HashTableTest Dump: [poire,11] [carotte,2] [tilleul,14] [abricot,0] [date,3] [banane,1] [grenade,5] [olive,10] [jujube,7] [reglisse,13] [pomme,12] [fenouille,4] [haricot,6] [myrtilles,9] [lentilles,8] (15 elements) abricot existait deja dans la table au prix de 0 Dump: [poire,11] [carotte,2] [tilleul,14] [abricot,50] [date,3] [banane,1] [grenade,5] [olive,10] [jujube,7] [reglisse,13] [pomme,12] [fenouille,4] [haricot,6] [myrtilles,9] [lentilles,8] (15 elements) banane 1 retrait de carotte 2 taille = 14 abricot -1192291216 banane -1396355223 carotte 554282218 date 3076014 fenouille -1911263983 grenade 283970894 haricot 696638104 jujube -1148951911 lentilles 261063800 myrtilles -1794874903 olive 105832923 poire 106845693 pomme 106849382 reglisse -687741100 tilleul -1314636057 taille 2 elianne tremblay age: 32 -1944701210 elianne tremblay age: 32 -1944701210 */