Implanter une nouvelle collection
Exercice 1 - Pris la main dedans
Il est classique dans plusieurs algorithmes d'utiliser une
structure de données appelée Bag.
Celle-ci permet de stocker des objets un certain nombre de fois,
la structure garde en mémoire le nombre de fois qu'un même objet
(au sens de equals) est stocké.
-
Écrire l'interface fr.umlv.util.bag.Bag
possédant les méthodes add, remove et
count qui respectivement
ajoute un objet, retire un objet et
renvoie le nombre d'occurences d'un objet.
-
Commenter l'interface écrite.
-
Fournir une implantation de cette interface permettant
d'ajouter et de retirer des élements en temps
constant moyen.
-
Ajouter une méthode Iterator<Map.Entry<T,Integer>> iterator()
qui renvoie un itérateur sur les couples (objet, nombre d'occurences).
-
Faire en sorte que l'on puisse choisir l'ordre des objets lors de l'itération
par une constante lors de la construction du Bag :
Bag<String> b1=new BagImpl<String>(ANY_ORDER); // n'importe quel ordre
Bag<String> b2=new BagImpl<String>(INSERT_ORDER); // ordre d'insertion
Bag<String> b3=new BagImpl<String>(NATURAL_ORDER); // ordre naturel de T
Quelles sont les contraintes sur T en fonction
de la collection utilisée ?
-
Remplacer les constantes passées lors de la construction
par une énumération (enum).
-
Discuter de l'utilité d'une enumération abstraite ici.
Implanter la solution proposée.
-
On souhaite que le code suivant marche :
Bag<String> bag=new Bag<String>(ANY_ORDER);
for(Map.Entry<String,Integer> entry:bag)
System.out.println(entry.getKey()+'='+entry.getValue());
Que doit-on faire ?
-
Pourquoi le code suivant ne marche pas ?
Bag<?> bag=new BagImp<String>(ANY_ORDER);
Iterator<Map.Entry<?,Integer>> it=bag.iterator();
Comment changer le code pour qu'il marche ?
-
De quelle interface des collections en Java doit hériter
l'interface Bag.
Quelles sont les problèmes que cela pose par rapport au code existant ?
-
Faire hériter Bag de cette interface et
écrire les méthodes manquantes.
Rémi Forax - Université de Marne La Vallée