:: Enseignements :: Master :: M1 :: 2007-2008 :: Java Avancé ::
[LOGO]

Map, list, capture, itérable, itérateur


Vous trouverez içi quelques notes concernant ce td.

Exercice 1 - Prendre de la hauteur

Soit la classe fr.umlv.td.author.Author :
public class Author {
	 public Author(String firstName,String lastName) {
	    this.firstName=firstName;
	    this.lastName=lastName;
	 }
	 public @Override String toString() {
	    return firstName+' '+lastName;
	 }
	 private final String firstName;
	 private final String lastName;
}

Exercice 2 - 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 3 - Interval

On souhaite pouvoir écrire le code suivant :
Iterator<Integer> it=rangeIterator(1,5);
for(;it.hasNext();)
   System.out.println(it.next()); // affiche 1 2 3 4 5

  1. Quel est le profil de la méthode rangeIterator ?
  2. Implanter cette méthode en utilisant une classe anonyme.
On souhaite maintenant pouvoir écrire le code suivant :
for(int i:range(1,5))
System.out.println(i); // affiche 1 2 3 4 5

  1. Quel est le profil de la méthode range ?
  2. Écrire une implantation utilisant la méthode rangeIterator ainsi qu'une version en une seule méthode.
  3. Combien le code donné en exemple effectue-t-il d'allocations ?
    Et le code ci-dessous ?
    for(int i:range(190,200))
       System.out.println(i);