Comparateur d'objets

De $1

Livres

Réaliser une classe Livre selon les spécifications suivantes. Un livre a un auteur et un titre qui le distinguent des autres. C'est-à-dire qu'on ne peut pas modifier ni l'auteur, ni le titre. En plus de cela, un livre possède un prix de vente qui peut être affecté à tout moment et modifié si besoin est, mais doit nécessairement être positif.

  • Proposer une implantation en Java ; 
  • Attention au(x) constructeur(s), aux accesseurs et aux modificateurs.

Identificateur

On voudrait de plus que chaque livre ait un identificateur unique (une chaîne de caractères). Voici les règles de construction de cet identificateur:

Les trois premiers caractères correspondent aux trois premiers caractères du nom de l'auteur (si le nom comporte au moins 3 caractères). La suite est un nombre entier unique (à générer automatiquement).  

  • Comment faire pour générer un nombre unique pour chaque instance de la classe Livre ? Proposer une solution pour implanter l'identificateur.

Bibliothèque

On veut maintenant créer la notion de bibliothèque. On propose donc de créer une classe Bibliothèque. Pour résumé, une bibliothèque possède une collection de livres.

La classe doit proposer les opérations suivantes :

  • ajouter un livre : le livre est ajouté à la collection,
  • archiver un livre : le livre retiré de la collection courante est mis aux archives (il n'est pas perdu),
  • afficher (sur la console) les livres de la collection triés selon trois ordres possibles :
    • par ordre croissant ou décroissant de l'ordre lexicographique du nom de l'auteur,
    • par ordre croissant de l'ordre lexicographique du titre des livres,
    • par ordre croissant ou décroissant du prix de vente des livres.

Il faudra donc implanter trois classes Comparator sur les livres pour chacun des ordres à proposer. Attention, on ne veut pas en faire six ! C'est-à-dire qu'on ne veut pas différencier les tris croissants et les tris décroissants par une classe séparée mais par un simple énuméré (ou booléen)!

Bonus: Unification

Dans l'exercice précédent, on s'aperçoit que l'inversion de l'ordre est un mécanisme générique à part entière. Sauriez-vous proposer un mécanisme générique qui inverse un ordre donné. 

Il y a au moins deux façons pour faire : 

  1. Par héritage en construisant une classe OrdreCroissantDecroissant abstraite.
  2. Par composition, en utilisant le mécanisme d'unification vu en cours et en définissant une classe concrète OrdreCroissantDecroissant

Implanter en Java les deux solutions. Laquelle semble la moins contraignante ?

Les points

Définitions

Sur la base du cours, implanter en java une classe Point. 

Réaliser une classe OrdreLexicographique qui permet d'ordonner les points selon un ordre lexicographique:

<x1,y1> <= <x2,y2> si x1 <= x2 ou si x1 == x2 && y1 <= y2.

Réaliser une classe OrdreSecond qui permet d'ordonner les points selon un ordre lexicographique qui donne la priorité aux ordonnées sur les abscisses :

<x1,y1> <= <x2,y2> si y1 <= y2 ou si y1 == y2 && x1 <= x2.

Sauriez proposer un mécanisme générique sur les vecteurs.

Recherche

Proposer une méthode rechercheDichotomique qui permet de trouver un Point dans une collection supposée ordonnée. Attention, il faut que le critère de recherche soit le même que celui qui a servi à trier la collection. On vous demande donc d'améliorer votre code du TP précédent pour réaliser l'équivalent de la méthode Collections.binarySearch qui prend en paramètre un objet de type Comparator pour indiquer l'ordre qui a été utilisé pour le tri. 

Une fois que vous savez réaliser la recherche dichotomique, ajouter des méthodes rechercherParNom, rechercherParTitre, rechercherParPrix dans la classe Bibliothèque. Chacune de ces méthodes utilisera le bon ordre pour faire la recherche. Comme on veut pouvoir faire les trois recherches, on ne peut pas supposer que la collection a préalablement été triée selon le bon ordre !