Dictionnaires

Un dictionnaire est une structure abstraite de données supportant généralement au moins trois opérations :

put
ajoute une paire clé/valeur à la structure (ou remplace une paire si la clé est déjà utilisée).
get
renvoie la valeur associée à une clé donnée (si la clé est connue).
remove
retire la paire contenant la clé donnée et renvoie la valeur associée (si la clé est connue).

Les dictionnaires en Java sont représentés par l'interface Map<K, V>K indique le type de la clé et V le type de la valeur associée. La paire clé/valeur est représentée par une autre interface nichée dans la première : Map.Entry<K, V>.

Map<K, V> n'hérite pas de Collection<E>, mais elle a besoin d'un Set<E> pour être parcourue, et Set<E> hérite de Collection<E>.

Les classes les plus utilisées qui réalisent Map<K, V> sont HashMap<K, V> (basée sur une table de hachage) et TreeMap<K, V> (basée sur un arbre binaire de recherche).

  1. Traces. Employez la méthode getAllStackTraces de la classe Thread afin d'écrire une application qui affiche à la console le nom de tous les processus en cours ainsi que la pile des appels de chacun.

    bob@box:~$ java Traces
    Finalizer :
      java.lang.Object.wait(Native Method)
      java.lang.ref.ReferenceQueue.remove(Unknown Source)
      java.lang.ref.ReferenceQueue.remove(Unknown Source)
      java.lang.ref.Finalizer$FinalizerThread.run(Unknown Source)
    
    main :
      java.lang.Thread.dumpThreads(Native Method)
      java.lang.Thread.getAllStackTraces(Unknown Source)
      Question1.main(Question1.java:6)
    
    ...
    

  2. Couleurs. Le fichier rgb.txt est une version du fichier qui permet le choix des couleurs dans un serveur X. Écrivez une application qui lit dans ce fichier et ouvre une fenêtre contenant une liste non déroulante (JList<E>) et un panneau. La liste offrira le choix entre tous les noms de couleur définis dans le fichier, et sélectionner l'un de ces noms provoquera la coloration du panneau en conséquence.

    La lecture de ce fichier se fait par le biais d'un flux d'entrée de la classe BufferedReader :

    try {
      BufferedReader lecture = new BufferedReader(
                               new FileReader("rgb.txt"));
      try {
        while((ligne = lecture.readLine()) != null) {
          ...
        }
      } catch(IOException e) {
        System.err.println("Erreur de lecture dans rgb.txt !");
      }
      try {
        lecture.close();
      } catch(IOException e) {
        System.err.println("Erreur de fermeture de rgb.txt !");
      }
    } catch(FileNotFoundException e) {
      System.err.println("Erreur d'ouverture de rgb.txt !");
    }

    Remarque Utilisez les méthodes split et trim de la classe String pour décomposer les lignes ainsi obtenues.

  3. Hachage. Écrivez votre propre classe pour remplacer le dictionnaire de l'exercice précédent. Vous ne réaliserez pas l'interface Map<K, V> au complet pour ne pas y passer trop de temps.

  4. Compteur. Écrivez une application qui demande en boucle des phrases, et qui affiche en réponse le nombre de fois que cette phrase a déjà été saisie. L'application s'arrêtera si la saisie est vide.

    La lecture à la console se fait à nouveau à l'aide d'un flux d'entrée :

    BufferedReader lecture = new BufferedReader(
                             new InputStreamReader(
                             System.in));

retour à la page d'accueil

retour au sommet