:: Enseignements :: ESIPE :: E4INFO :: 2011-2012 :: Java Avancé ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | Examen de Java Avance |
Quelques conseils avant de commencer, prenez le temps de lire entièrement
le sujet, si vous ne comprenez pas quelque chose essayez de faire un dessin,
si des tests JUnits ne compilent pas, cela veut dire que la signature
de votre méthode n'est pas la bonne (il n'y a pas de méthode surchargée dans
le sujet à part celles de l'API bien sûr), si un test JUnit ne marche pas
et que vous ne comprenez pas pourquoi, relisez la doc de la méthode
que vous devez implanter plutôt que d'écrire la méthode pour qu'elle passe
le test.
Exercice 1 - MultiMap
Le but de cet exercice est d'implanter une MultiMap, qui est
une sorte de Map mais qui accepte plusieurs valeurs pour une même clé
pourvu que les valeurs soient différentes. En fait, on peut voir une
MultiMap comme une Map dont les valeurs sont des Set.
Une MultiMap ne devra jamais stocker null que cela soit en tant
que clé ou en tant que valeur.
L'interface de
fr.umlv.exam1.MultiMap est la suivante
-
La méthode size renvoie le nombre total de couples insérés
dans la MultiMap. Notez que le nombre de clés de la MultiMap
sera toujours inférieur ou égal à size.
-
La méthode get prend en paramètre une clé et renvoie un ensemble
contenant l'ensemble des valeurs qui ont pour clé la clé recherchée.
Si la clé demandée ne possède aucune valeur, la méthode get devra
renvoyer un ensemble vide.
-
La méthode put ajoute un couple clé/valeur à la MultiMap,
si le couple clé/valeur existe déjà la méthode renvoie false
sinon la méthode ajoute la valeur dans l'ensemble des valeurs associées
à la clé et renvoie vrai.
On appelera
MultiMapImpl le nom de classe implantant l'interface
MultiMap
et celle-ci ne devra en aucun cas être visible par un utilisateur externe,
pour cela,
MultiMapImpl devra être implantée en tant que classe interne
de la classe
MultiMaps qui elle contiendra un ensemble de méthodes
statiques permettant de créer des
MultiMap.
-
Ecrire une méthode statique createMultiMap dans la classe
MultiMaps qui ne prend rien en paramètre
et renvoie une MultiMap dont l'ordre des clés est indéfini.
-
On souhaite maintenant pouvoir choisir lors de la création de la MultiMap
si l'ensemble des clés de celle-ci est non triée (UNSORTED),
triée par clé (SORT_BY_KEY) ou triée par ordre d'insertion
(SORT_BY_INSERTION_ORDER).
Ecrire un enum nommé Kind interne à l'interface MultiMap
qui définit les 3 constantes (ci-dessus) spécifiant l'ordre des clés de la
MultiMap.
-
Ecrire une méthode statique createMultiMap2 dans la classe
MultiMaps qui prend en paramètre un ordre pour les clés de
la MultiMap (de type Kind) et renvoie une MultiMap
qui stockera ses clés dans l'ordre spécifié.
Vous utiliserez un switch pour distinguer entre les ordres de clés possibles.
-
Ecrire une méthode statique createMultiMap3 qui marche exactement comme
createMultiMap2 mais qui utilise la technique de l'enum abstrait
pour différencier selon l'ordre des clés plutôt qu'en utilisant un switch.
-
Ajouter une méthode iterator à l'interface de MultiMap qui renvoie
un Iterateur sur toutes les valeurs (à plat) stockées dans la MultiMap.
L'iterateur devra permettre de retirer des valeurs de la MultiMap.
-
Modifier l'interface MultiMap pour qu'il soit possible de faire
un foreach sur une MultiMap.
-
Ecrire une méthode statique createMultiMap4 dans la classe
MultiMaps qui prend en paramètre en plus de l'ordre pour les clés
un second paramètre de type Class permettant de spécifier
la classe des ensembles qui sont utilisés pour stocker les valeurs.
Par exemple, une MultiMap créer avec en paramètre une classe
correspondant à un ExoticSet devra renvoyer des Set
de type ExoticSet si l'on utilise la méthode get
de la MultiMap.
La méthode createMultiMap4 devra tester que la classe passée
en paramètre est valide pour être utiliser pour créer des ensembles
avant de créer la MultiMap.
Le test JUnit est ici
MultiMapTest.java
et vous avez aussi besoin de la classe
FakeSet.java.
Attention, cette classe utilise son propre package
fr.umlv.exam1.test
et non pas celui de
MultiMap.
© Université de Marne-la-Vallée