:: Enseignements :: Licence :: L3 :: 2020-2021 :: Programmation Objet avec Java ::
[LOGO]

Objets, délégation, ArrayList, HashMap


Exercice 1 - Eclipse

À partir de maintenant, nous allons utiliser Eclipse (lancer la commande eclipse dans un terminal) comme environnement pour faire les TPs.
  1. Créer un projet nommé TP4.
  2. Modifier les propriétés du projet TP4 pour que les classes (fichiers .java) soit générées dans le répertoire sources.
  3. Faire de même pour tous les futurs projets qui seront créés (Aller voir dans le menu Window > Preferences).
  4. Vérifier que l'environnement d'exécution est bien Java-15, changer si ce n'est pas le cas.
  5. Vérifier que l'environnement de compilation est bien 15, changer si ce n'est pas le cas.
  6. Écrire une classe Main qui affiche Hello Eclipse.
  7. A faire à la maison pour le compte rendu:
    1. Que fait sysout + Ctrl + Space dans un main ?
    2. Que fait toStr + Ctrl + Space dans une classe ?
    3. Définir un champs foo de type int, que fait get + Ctrl + Space, et set + Ctrl + Space .
    4. Dans le menu Source, comment générer un constructeur initialisant le champ foo ?
    5. Sélectionner le nom de la classe puis Alt + Shift + R, qu'obtient-on ? Même question avec le champ foo .
    6. Écrire a = 2 + 3 + 4, puis sélectionner 2 + 3 puis Alt + Shift + L .
    7. Écrire new Integer(2), en gardant le curseur après ')', appuyer sur Ctrl + 1, que se passe-t-il ?
    8. Déclarer une variable s de type String et cliquer sur String en maintenant la touche Ctrl . Que se passe-t-il ?
    9. Dans la méthode toString(), que fait un Ctrl + Clic sur super.toString() ?
    10. Sélectionner le champs foo, puis Ctrl + Shift + G. Que se passe-t-il ?
    11. À quoi sert Ctrl + Shift + O ?
    12. À quoi sert Ctrl + Shift + C ?

    Apprenez les raccourcis que nous venons de voir, cela vous fera gagner du temps lors des TPs notés.

Exercice 2 - Library

On souhaite écrire une classe Library, une bibliothèque, permetannt de stocker des livres tel que le code suivant fonctionne
    var library = new Library();
    library.add(book);
    System.out.println(library.findByTitle("Da Vinci Code"));
   

Pour stocker les livres, nous allons utiliser la classe java.util.ArrayList qui est une implantation d'un tableau dynamique (qui s'agrandit si nécessaire).

Vous utiliserez le record Book suivant
public record Book(String title, String author) {
  public Book {
    Objects.requireNonNull(title);
    Objects.requireNonNull(author);
  }
 
  @Override
  public String toString() {
    return title + " by " + author;
  }
}
   
Avec Eclipse, faire un copier coller du code ci-dessus dans le répertoire src fonctionne !

  1. Ecrire une classe Library avec un champs books de type ArrayList ainsi qu'un constructeur sans paramètre initilisant le champ books.
    Attention à déclarer les bons modificateurs pour le champ books.
  2. Ajouter une méthode add qui permet d'jouter des books (non null) à la liste de livres.
    Note: le compilateur léve un warning, comment corriger le problème ?
  3. Ecrire une méthode findByTitle qui permet de trouver un livre en fonction de son titre dans la bibliotèque. La méthode doit renvoyer null dans le cas où aucun livre n'a le bon titre.
  4. Comment le compilateur compile-t-il une boucle foreach sur une collection ?
    Utiliser la commande javap pour vérifier !
           javap -c Library.class
         
  5. Expliquer pourquoi la méthode findByTitle renvoie null plutôt que de lever une exception ?
  6. Ecrire une méthode toString affichant les livres dans la bibliothèque dans l'ordre d'insertion, un livre par ligne.

Exercice 3 - Librarie 2 (le retour de la vengeance)

L'implantation faite dans l'exercice précédente est lente si la méthode findByTitle est appelée fréquemment. On va changer l'implantation en gardant la même interface, les mêmes méthodes publiques avec les mêmes signatures comme cela il ne sera pas nécessaire de changer le main !

  1. Quelle est la complexité de la méthode findByTitle de la classe Library ?
  2. Regarder la javadoc de la classe java.util.HashMap ainsi que ces méthodes put et get.
    Quelle est la structure de données algorithmique dont java.util.HashMap est une implantation ?
    Sachant que l'on veut améliorer la performance de findByTitle comment peut on utiliser la classe java.util.HashMap pour cela ?
    Quel sera alors la complexité de findByTitle ?
  3. Commenter les champs et méthodes de la classe Library et ajouter un constructeur, une méthode add et une méthode findByTitle avec les mêmes signatures que les méthodes commentées ainsi que leurs implantations.
  4. Expliquer pourquoi ici, on a préfèré utiliser une classe pour représenter Libarry plutôt qu'un record.
  5. Pour l'implantation de la méthode toString, qu'elle méthode de java.util.HashMap doit on utiliser pour obtenir l'ensemble des valeurs stockées ?
    Commenter le code de la méthode toString et dupliquer le en modifiant celui-ci pour que la méthode toString fonctionne.
    Pour cela utiliser la javadoc de java.util.HashMap pour trouver la méthode qui renvoie ses valeurs stockées.
  6. En fait, la méthode toString ne marche pas exactement comme demandé, car elle n'affiche pas les élements dans l'ordre d'insertion. Sachant qu'il existe une classe LinkedHashMap, comment peut-on l'utiliser pour résoudre se problème ?
  7. On souhaite ajouter une méthode removeAllBooksFromAuthor qui prend un nom d'auteur en paramètre et supprime tous les livres de cet auteur de la bibliothèque.
    Sachant qu'il existe une méthode remove dans la classe java.util.HashMap, écrire une implantation qui parcourt tous les livres avec une boucle for each et supprime ceux de l'auteur avec remove ?
    Pourquoi votre implantation lève une exception dans l'exemple suivant
          var library2 = new Library();
          library2.add(new Book("Da Vinci Code", "Dan Brown"));
          library2.add(new Book("Angels & Demons", "Dan Brown"));
          library2.removeAllBooksFromAuthor("Dan Brown");
         
  8. En fait, il existe une méthode remove sur l'interface Iterateur qui n'a pas le problème car le parcours et la suppression se font sur le même itérateur.
    Implanter correctement la méthode removeAllBooksFromAuthor.
  9. De façon optionnelle, si vous êtes balèze, il existe une méthode removeIf sur Collection qui permet d'écrire la méthode removeAllBooksFromAuthor en une ligne !