Première partie
Objectifs d'apprentissages
- Créer soi-même une méthode equals(Object o)
- Implémenter un type paramétré, ici une interface
- Utiliser l'interface java.util.Comparator<T>
Section 1: la méthode equals
Comme vous le savez, la classe Object déclare une méthode equals.
public class Object {
// ...
public boolean equals(Object obj) {
return this == other;
}
}
Puisqu'en Java, toutes les classes héritent des caractéristiques de la classe Object. Toutes les classes possèdent donc une méthode boolean equals(Object obj). C'est vrai pour les classes prédéfinies, mais aussi pour toutes les classes que l'on crée soi-même.
On utilise la méthode equals afin de comparer les objets désignés par des variables références. Étant donné deux variables référence a et b, et les objets désignés:
- Pour comparer l'identité des objets (est-ce que a et b désignent le même objet ou non?), on utilise l'opérateur de comparaison «==» (donc «a == b»);
- Pour comparer le contenu des deux objets (est-ce que le contenu des objets désignés est logiquement équivalent?), on utilise la méthode «equals» (donc a.quals(b)).
Pour cette première partie, vous devez créer la classe Book. Son implémentation est très simple. Voici les éléments que vous devrez intégrer:
- Une variable d'instance author de type String;
- Une variable d'instance title de type String;
- Une variable d'instance year de type int (l'année de publication du livre);
- Un contructeur Book(String author, String title, int year), qui reçoit en paramètre l'auteur, le titre, l'année de publication;
- Une méthode toString(), qui retourne une chaîne de caractère ayant le format suivant: «author: title (year);
- Une méthode equals(Object o).
Votre implémentation doit être robuste. En particulier, une méthode equals ne devrait jamais produire une erreur d'exécution. Les objets sont logiquement équivalents ou ils ne le sont pas.
Question 1.1:
Implémentez la classe Book. Utilisez le gabarit fourni comme point de départ.
Section 2: l'interface java.util.Comparator<T>
Pour votre dernier laboratoire, vous avez utilisé l'interface Comparable pour creér des objets de la classe Post. Un objet qui implémente cette interface doit redéfinir la méthode compareTo et ainsi être capable de se comparer à un autre objet.
Contrairement à Comparable, une classe implémentant l'interface Comparator est externe au type d'élément que nous comparons. Une telle classe doit implémenter les méthodes compare et equals pour définir et imposer l'ordre de tri.
Ainsi, la méthode sort de la classe Collections.sort or Arrays.sort utilisera la méthode compare du comparateur (objet réalisant l'interface Comparator). Il nous faut donc une méthode compare qui puisse traiter le type d'éléments se trouvant dans la liste (objet de la classe ArrayList, par example).
Puisque Comparator est une interface, il lui faut une implémentation concrète.
Notez que la classe ArrayList possède un paramètre de type. Pour ce laboratoire, nous déclarons des variables de type ArrayList<Book>. Ainsi, l'instance ne reçoit que des objets de la classe Book. Du coup, la méthode sort doit recevoir un comparateur pour des objets de la classe Book. Ainsi, BookComparator réalisent l'interface Comparator<Book>. Le grand avantage de cette structure de programme, c'est que l'on peut comparer les objets selon plusieurs critères (par author, par title, par year) et donc trier les éléments en fonctions de critères variés.
Vous devez créer une classe Library afin de sauvegarder des objets de la classe Book. Pour ce faire, nous utilisons à nouveau ArrayList. De plus, on souhaite trier les éléments de la liste à l'aide d'un objet Comparator. Vous devez trier les éléments de la liste d'abord par auteur, ensuite par titre, et finalement selon l'année de publication (bien sûr, dans une application complète, il y aurait plusieurs comparateurs).
La classe Library a les caractéristiques suivantes:
- void addBook(Book b): ajoute un livre à la bibliothèque (ajout d'un objet de la classe Book à l'aide de la méthode addBook de l'objet de la classe Library);
- void sort(): trie les éléments à l'aide d'un objet Comparator;
- void printLibrary(): affiche tous les livres dans l'ordre actuel de la liste.
Question 1.2:
Vous devez compléter l'implémentation de la classe Library ainsi que BookComparator. Utilisez les gabarits fourni pour Library et BookComparator comme point de départ.