:: Enseignements :: IMAC :: IMAC2 :: IMAC2 2011-2012 :: Programmation Java ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | Collections et énumérations |
Ce TD est l'occasion d'avoir un aperçu des collections (java.util.Collection) de l'API Java avec les listes (List), les ensembles (Set) et les dictionnaires (Map). Nous abordons également l'usage des énumérations (Enum).
Exercice 1 - Enum
Une énumération est une classe spécifique définissant un ensemble de constantes auxquelles nous pouvons associer des propriétés. Nous souhaitons ici créer une énumération pour spécifier les différentes versions de média, associées à une propriété de modification de prix (double indiquant le coefficient multiplicateur) et de titre (suffixe à ajouter). Voici les différentes versions :
- Version collector (prix * 1.10, suffixe de titre "collector")
- Version soldée (prix * 0.5, suffixe de titre "discount")
- Version normale (prix * 1.0, suffixe de titre vide)
- Créer la classe enum Version avec les différentes versions avec une méthode String getExtension() pour obtenir le suffixe de titre et double modifyPrice(double price) pour adapter le prix normal à la version.
- Adapter la classe AbstractMediaBuyable en ajoutant un champ enum Version, en ajoutant un constructeur avec un argument version et en modifiant l'implantation des méthodes String getTitle() et double getPrice().
Les collections
L'interface java.util.Collection définit des méthodes permettant d'obtenir le nombre d'éléments de la collection (int size()) ainsi qu'un itérateur (en étendant Iterable) pour parcourir les éléments de cette collection. Des méthodes permettent également de modifier la collection en y ajoutant ou supprimant un élément. Les interfaces List et Set héritent de Collection.
Exercice 2 - List
Une liste est une collection ordonnée d'éléments. Plutôt que d'utiliser un itérateur obligeant de parcourir les éléments précédents, il est possible d'accéder à l'élément i d'une liste à l'aide de la méthode E get(int index)
- Comparer les classes ArrayList et LinkedList pour les opérations courantes (accès à l'élément d'indice i, ajout d'un élément, suppression d'un élément).
- On souhaite remplacer le type fr.upemlv.data.LinkedList utilisé dans la classe Library par soit java.util.ArrayList, soit java.util.LinkedList. Quel choix est le plus judicieux ? Pourquoi ?
- Adapter la classe Library pour le nouveau type de liste.
Exercice 3 - Set
Un Set est un ensemble ne contenant qu'une seule fois chaque élément. Il peut être ordonné (LinkedHashSet où l'ordre d'insertion des éléments est conservé) ou non (par exemple HashSet).
Pour savoir si un élément est déjà présent dans l'ensemble, il est nécessaire d'indexer ceux-ci dans la structure utilisée. Deux principales approches sont employées dans l'API Java :
- L'indexation par table de hachage avec HashSet
- L'indexation par arbre binaire de recherche utilisant un équilibrage "rouge-noir" avec TreeSet
Pour insérer ou rechercher un élément dans une table de hachage, il est nécessaire de calculer pour chaque élément une valeur de hachage entière : il faut redéfinir la méthode int hashCode() de Object qui retourne initialement l'adresse mémoire de l'objet (suffisant pour une égalité par référence mais pas pour une égalité de contenu de l'objet). Deux objets égaux selon leur méthode equals retournent nécessairement la même valeur de hachage ; deux objets de même valeur de hachage ne sont pas égaux. Une itération sur un HashSet retourne les éléments en suivant l'ordre de leur valeur de hachage (cet ordre peut être considéré comme quelconque).
Pour manipuler des éléments dans un TreeSet, ceux-ci doivent être munis d'un ordre total : ils doivent implanter l'interface Comparable<T> pour pouvoir les comparer à un autre élément du même type. Cette interface définit une méthode int compare(T e) retournant une valeur nulle si this et e sont égaux, une valeur négative si this < e, positive si this > e.
On souhaite ajouter une livre d'or dans la classe Library afin de pouvoir y ajouter des messages. Pour éviter les doublons, on utilise un Set.
- Ajouter un champ pour le livre d'or dans Library ainsi que des méthodes void addMessage(String message) et printMessages() ; on ne souhaite pas pour l'instant conserver les messages dans un ordre spécifique.
- Modifier le type du champ pour que les messages soient affichés dans un premier temps dans l'ordre chronologique puis dans un deuxième temps dans l'ordre alphabétique
Exercice 4 - Map
On souhaite associer à chacun des médias de la bibliothèque une note. On utilise pour cela une Map qui associe à chacune de ses clés (ici les médias) une valeur (un Double).
- Quelles sont les différences entre Set et Map. Serait-il possible de réimplanter un Set en utilisant une Map ?
- Consulter la Javadoc pour répertorier les classes concrètes implantant l'interface Map : quelle classe choisir pour la situation présente ?
- Implanter une méthode double getNote(MediaBuyable media) et void setNote(MediaBuyable mb, double note) dans la classe Library.
- Modifier la classe Library afin que lors de l'appel à setNote si une notation a déjà eu lieu pour le média, celle-ci soit mise à jour en calculant une moyenne de notes plutôt que de remplacer l'ancienne note.
© Université de Marne-la-Vallée