:: Enseignements :: ESIPE :: E3INFO :: 2015-2016 :: Programmation Objet avec Java ::
[LOGO]

Table de hachage, Comparaisons, itérateurs


Exercice 1 - Association et contrat sur les Objets

Sachant que la classe Pair est définie comme ceci :
     public class Pair {
       private final String first;
       private final String second;

       public Pair(String first, String second) {
         this.first=first;
         this.second=second;
       }
       public String getFirst() {
         return first;
       }
       public String getSecond() {
         return second;
       }
       @Override
       public String toString() {
         return first+" "+second;
       }
     }
     
  1. Pourquoi le code ci-dessous n'affiche pas ce qu'il faut ?
        HashMap<Pair,String> map=new HashMap<Pair,String>();
        map.put(new Pair("jean-paul","sartre"),"mort");
        map.put(new Pair("elvis","presley"),"vivant");
        
        map.remove(new Pair("elvis","presley"));
        System.out.println(map);
       
  2. Que doit-on faire pour résoudre le problème ?
    Si vous ne voyez pas d'où ça vient, vous pouvez remplacer l'avant dernière ligne par
    System.out.println(map.remove(new Pair("elvis","presley")));
  3. Écrire un petit programme qui vous permet, en boucle sur la ligne de commande, d'entrer sur une ligne 3 mots et d'associer dans la table le 3ème mot (comme valeur) à la paire constituée des deux premiers (comme clé). Pour chaque "triplet" de mots entré, le programme affiche soit "nouveau" si la clé n'existait pas dans la table, soit l'ancienne valeur associée à la clé.
    Par exemple, en partant d'une table vide, vous devez obtenir le comportement suivant (ce qui apparait en gras est saisi par l'utilisateur):
    $ java fr.upem.jlb.td08.Pair
    jean-paul sartre mort
    nouveau
    elvis presley vivant
    nouveau
    elvis presley mort
    vivant
    jean-paul sartre ressucité
    mort
    ^D
    $
    
    Indications:
    Pour lire les triplets de mots, vous pouvez utiliser un java.util.Scanner (lire la documentation) et ses méthodes hasNext() et next(), ou encore hasNextLine(). Votre programme pourra s'arrêter lorsque vous taperez la combinaison de touches "Control-D" (ou ^D) au clavier, ce qui ferme le flot d'écriture correspondant à l'entrée standard (System.in) de votre programme; les méthodes has...() de Scanner retournent alors false.

Exercice 2 - Ordre plus ou moins naturel

L'objectif de cet exercice est de manipuler les méthodes de tri (sort) de la classe Arrays.

  1. Ecrire une classe Tri avec sa méthode main qui affiche successivement le tableau de ses arguments sur la ligne de commande (args):
    • dans l'ordre où ils sont saisis par l'utilisateur
    • dans l'ordre lexicographique (ordre naturel des String)
    • dans l'ordre de la chaîne la plus courte à la chaîne la plus longue. Donner une solution avec une classe anonyme et une avec une lambda expression.
    Par exemple:
    java fr.upem.bases.td09.Tris un deux trois quatre cinq
    Original:
    [un, deux, trois, quatre, cinq]
    Ordre naturel:
    [cinq, deux, quatre, trois, un]
    Ordre longueur de chaîne
    [un, cinq, deux, trois, quatre]
    

  2. Ecrire une classe TriPair dont la méthode main, sur le même principe que la classe précédente, réalise les opérations suivantes:
    • construit une liste de Pair à partir du tableau args (si le nombre d'argument est impair, elle lèvera une exception)
    • Affiche ces paires dans l'ordre où elles ont été saisies par l'utilisateur
    • Affiche ces paires dans l'ordre naturel des Pair (qui est l'ordre lexicographique de first, puis de second)
    • Affiche ces paires dans l'ordre du nombre de caractères dans les champs first et, à nombre de caractères égaux, l'ordre lexicographique de second). Donner une solution avec une classe anonyme et une avec une lambda expression.

Exercice 3 - LinkedLink Générique Iterable

A partir du code de votre classe LinkedLink générifié dans l'exercice 3 de la séance précédente, faites en sorte que cette classe soit Iterable, et puisse par exemple être utilisée comme dans le programme suivant, qui lit sur l'entrée standard des lignes de texte qu'il stocke dans une LinkedLink, jusqu'à lire une ligne vide. Il affiche alors le nombre de caractères de chacune des lignes, puis le nombre de caractères total:
L'exécution de ce code doit donner ceci (ce qui apparait en gras est saisi par l'utilisateur):
$ java fr.upem.data.main.Iter
bla
bla bla
trucc much
ta tzoin

[ta tzoin, trucc much, bla bla, bla]
[8] : ta tzoin
[10] : trucc much
[7] : bla bla
[3] : bla
Total length: 28
$