![]() |
Collections et types paramétrés |
À 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.
add()
pour
prendre en compte ce type paramétré. 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.
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
.
Vendable
et la classe
Produit
avec un constructeur et une méthode
toString()
. 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. 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. 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. 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. asMap()
a la possibilité de modifier la
collection. Modifier votre code afin que la table de hachage
retournée soit immutable.