:: Enseignements :: Master :: M1 :: 2009-2010 :: Java Avancé ::
[LOGO]

Implanter une nouvelle collection


Exercice 1 - Capture de carte sauvage

On souhaite implanter un algorithme permettant de mélanger les éléments d'une liste dans un ordre aléatoire.

  1. Indiquer un algorithme possible pour cela. Quel est la complexité de celui-ci ?
  2. Implanter une méthode swap suivant la documentation suivante :
    /** Swaps the elements at the specified positions in the specified list.
     * (If the specified positions are equal, invoking this method leaves the list
     *  unchanged.)
     * @param list the list in which to swap elements.
     * @param i the index of one element to be swapped.
     * @param j the index of the other element to be swapped.
     * @throws IndexOutOfBoundsException if either i or j is out of range.
     */
    
  3. Que doit-on faire pour que la méthode swap ait la signature suivante :
    void swap(List<?> list,int i,int j);
    
  4. Ecrire une méthode shuffle utilisant la méthode swap pour permuter les valeurs.
    La classe java.util.Random est un générateur pseudo-aléatoire.
  5. En supposant que l'on veuille répartir les élements de façon aléatoire entre deux listes, expliquer pourquoi la capture ne marche pas avec une méthode ayant la signature suivante :
    void shuffle(List<?> list1,List<?> list2);
    
  6. Quelle est la complexité du code que vous avez écrit pour shuffle ? Dans le cas où la liste est une LinkedList ? Comment améliorer cette dernière complexité ?

Exercice 2 - 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é.

  1. É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.
  2. Commenter l'interface écrite.
  3. Fournir une implantation BagImpl de cette interface permettant d'ajouter et de retirer des élements en temps constant moyen.
  4. Ajouter une méthode Iterator<Map.Entry<T,Integer>> iterator() qui renvoie un itérateur sur les couples (objet, nombre d'occurences).
  5. 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 :

    Quelles sont les contraintes sur T en fonction de la collection utilisée ?
  6. Remplacer les constantes passées lors de la construction par une énumération ( enum ).
  7. Discuter de l'utilité d'une enumération abstraite ici. Implanter la solution proposée.
  8. On souhaite que le code suivant marche :

    Que doit-on faire ?
  9. Pourquoi le code suivant ne marche pas ?

    Comment changer le code pour qu'il marche ?
  10. De quelle interface des collections en Java peut hériter l'interface Bag ?
    Quelles sont les problèmes que cela pose par rapport au code existant ?
    Le code suivant :
    Doit afficher :
    Remi
    Remi
    Guillaume