[UMLV]

Collections et types paramétrés

Exercice 1 - Table générique paramétrée

À partir des classes développées pour l'exercice 3 de la feuille de TD 2 (Interfaces, classes internes et itérateurs) on veut définir une classe Table<T> paramétrée par le type T des éléments qu'elle peut contenir.

  1. Modifier le constructeur et la méthode add() pour prendre en compte ce type paramétré.
  2. Écrire les différentes solutions possibles pour la méthode iterator() en utilisant les types paramétrés (classe externe, classe interne, classe anonyme, classe nommée locale à la méthode). Tester chacune de ces solutions.
  3. Quelle solution proposez maintenant vous pour écrire une classe permettant de stocker des voitures. Comme dans la feuille de TD 2, la classe TableVoiture devra posséder les méthodes suivantes :

Exercice 2 - Panier de produits

On souhaite manipuler des données de type Produit ; ce type est défini par un identifiant id de type entier et un fabriquant de type String. De plus, le type Produit doit implanter l'interface Vendable, qui déclare uniquement la méthode int getPrix() devant retourner le prix de ce qui est à vendre. Un « panier » de type Panier permet de stocker des choses à vendre de même nature, comme par exemple des Produit.

  1. Écrire l'interface Vendable et la classe Produit avec un constructeur et une méthode toString().
  2. Écrire une classe Panier, paramétrée par le type des « choses » qu'il peut contenir. On contraint ces choses à avoir un prix, c'est-à-dire à être d'un sous-type de Vendable. Pour l'instant on pourra stocker ces choses dans un conteneur de type List. Munir la classe Panier d'un constructeur et de méthodes add() et iterator() adaptées au type paramètre de la classe. Grâce à cette deuxième méthode, la classe pourra implanter l'interface Iterable, également adaptée au paramètre. Tester ces classes en ajoutant différents produits dans un panier et en affichant ensuite ses éléments par une boucle de type for-each.
  3. On aimerait que la liste des choses contenues dans un panier soit triée suivant l'ordre « naturel » de ces choses. Par exemple, dans le cas des produits, disons que l'ordre naturel correspond à l'ordre croissant des id et, à id égaux, à l'ordre lexicographique sur le nom du fabriquant. Doter la classe Produit de cet ordre et la classe Panier d'une méthode sort() qui trie les choses qu'il stocke.
  4. Surcharger la méthode sort() de la classe Panier de sorte qu'elle accepte un comparateur (spécifique). Penser à l'utilisation des types paramétrés. Tester cette méthode avec un comparateur spécifique qui trie les produits par nom de fabriquant lexicographiquement croissant, et un autre qui trie n'importe quelles choses du panier par prix croissant.
  5. Plutôt que de trier les éléments du panier « à la demande », on souhaite maintenant maintenir ces éléments triés (dans l'ordre naturel) au fil des insertions. On aimerait stocker les éléments dans une structure de données triée : Java offre les ensembles (Set), mais ceux-ci ne supportent pas les doublons. Une solution (discutable) consiste à utiliser une table de hachage triée qui associe à chaque produit (nécessairement unique), le nombre d'occurrences de ce produit dans le panier. Implanter cette solution et la tester avec une méthode asMap() qui retourne cette table de hachage.
  6. Le problème principal de la solution précédente est que l'utilisateur ayant récupéré une table de hachage par la méthode asMap() a la possibilité de modifier la collection. Modifier votre code afin que la table de hachage retournée soit immutable.