IUT Charlemagne - Dept info Complément JAVA 2012-2013 DUT 2A TD 10 - HashMap 1 Présentation du sujet On souhaite développer une classe générique TabAsso en JAVA permettant de manipuler un tableau associant des objets d’une classe E à des objets d’une classe F. Exemple : une liste de courses qui associe à chaque élément le nombre d’éléments à acheter. Clef (de type E, par ex String) Valeur (de type F, par ex Integer) ≪ Jambon ≫ 4 ≪ Poireau ≫ 2 ≪ Chocolat ≫ 1 La classe TabAsso consistera en un tableau de couples (clef, valeur), chaque clef ne pouvant être présente qu’une seule fois dans le tableau. 2 Classe Couple Pour ce faire, vous allez commencer par écrire la classe générique Couple. Chaque objet de cette classe contient deux attributs – un attribut clef de type E (variable de type) – un attribut valeur de type F (variable de type) La classe Couple permet de modéliser les associations clef-valeur : un objet de type Couple représente une association de ce type. 2.1 Déclaration et constructeur Déclarer la classe Couple. Écrire un constructeur qui prend une clef et une valeur en paramètre et qui permet de créer l’objet Couple correspondant. 2.2 Accès Ecrire une méthode getClef() qui retourne la clef du couple. Cpt JAVA - TD 10 - HashMap 1 2.3 Utilisation Utilisez le constructeur dans un main pour associer à la clef String ”Jambon” l’entier 4. 3 Tableau associatif 3.1 Déclaration Un tableau associatif est aussi une classe générique (il faut préciser à l’utilisation le type des clefs et le type des valeurs, exactement comme la classe HashMap de JAVA) Un objet de type tableau associatif contient un attribut listeCouples qui est ArrayList des couples correspondant. Chaque couple de cette liste correspondra à une association stockée dans le tableau associatif. Déclarer la classe et ses attributs. 3.2 Constructeur Écrire un constructeur qui construit un tableau associatif en initialisant l’attribut listeCouples (ne contenant initialement pas d’élément) 3.3 Méthode get Déclarer et écrire la méthode get. Cette méthode prend en paramètre une clef et retourne la valeur associée à cette clef (en parcourant le tableau de couples). Si cette clef n’est associée à aucune valeur, la méthode retourne null. 3.4 Méthode insertion Déclarer et écrire la méthode insertion permettant d’ajouter une association au tableau. Cette méthode vérifie si la clef est présente (auquel cas, elle modifie la valeur associée) si la clef n’est pas déjà présente, elle ajoute l’association. 3.5 Méthode toString Écrire une méthode toString. 3.6 Tests Vérifiez le bon comportement de vos méthodes en créant une liste de courses. Une fois que cela est fait, testez le comportement de vos classes avec le morceau de programme suivant : Cpt JAVA - TD 10 - HashMap 2 //test1 TabAsso<String,Integer> t=new TabAsso<String, Integer>(); t.insertion("Jambon", 4); t.insertion("Jambon", 84); String a="Jambon"; t.insertion(a,56); System.out.println(t); // test2 TabAsso<String,Integer> t2=new TabAsso<String, Integer>(); t2.insertion("Jambon", 84); String b="Jam"; b=b+"bon"; t2.insertion(b,56); System.out.println(t2); Y a-t-il un comportement différent. Si oui, pourquoi ? Comment pensez vous comparez les clefs ? Avez vous besoin de modifier la déclaration de la classe tableauAssociatif ? pourquoi ? Comment s’effectue la comparaison par défaut ? Comment modifier la manière dont la comparaison s’effectue ? 3.7 Méthode listeclef Déclarer et écrire une méthode retournant la liste des clefs. 4 4.1 Héritage Utilisation de tabAsso Soit un tableau associatif tabAsso associant des String (valeur) à des Numbers (clef). Déclarer ce tableau associatif. Peut-on utiliser ce tableau pour associer des String à des Integer ? Oui/non ? Comment et pourquoi ? Peut on utiliser ce tableau comme paramètre d’une fonction qui prend un tableau associatif associant des String à des Integer ? oui/non ? pourquoi ? 4.2 Interface générique Comme il existe plusieurs manières d’implémenter un tableau associatif (table de hachage, liste de couples, . . .cf cours de structure). Nous allons donc séparer la déclaration Cpt JAVA - TD 10 - HashMap 3 de l’interface (qui propose les méthodes) de son implémentation. Modifiez votre code en développant – une interface générique Tab<E,F> proposant toutes les méthodes – la classe tabAsso<E,F> implémentant cette interface 4.3 TabAsso affichable On souhaite faire un tableau associatif stockant des clefs affichable (qui possède la méthode affiche) Comment faire ? et pourquoi ? Proposer une classe héritant de TabAsso fonctionnant de cette manière et ayant la méthode affiche (affichant la liste des clefs) Utiliser cette classe convenablement en vérifiant que des tests équivalents à ceux de la question 3.5 sont encore valides. Cpt JAVA - TD 10 - HashMap 4