Fonctionnalité de recherche
Fait partie de la section Programmation Orientée Objet du Journey Java de Coddy. Leçon 80 sur 87.
Défi
FacileAméliorons votre système de gestion de bibliothèque avec de puissantes fonctionnalités de recherche ! Une bibliothèque n'est pas très utile si les utilisateurs ne peuvent pas trouver les livres qu'ils recherchent. Vous ajouterez des méthodes pour effectuer des recherches par titre et par auteur, rendant ainsi votre bibliothèque véritablement fonctionnelle.
Vous continuerez à développer votre code existant réparti sur quatre fichiers :
Book.java: conservez votre classe Book avec toutes ses fonctionnalités existantes : isbn, title, author, isAvailable, borrowedBy, getDetails(), ainsi que les getters/setters appropriés. Assurez-vous de disposer de méthodes getter pourtitleetauthorsi vous ne les avez pas encore ajoutées.User.java: conservez votre classe User telle quelle avec id, name, la ArrayList borrowedBooks, borrowBook(), returnBook(), getBorrowedCount() et toString().Library.java: enrichissez votre classe Library avec des fonctionnalités de recherche. Conservez toutes les méthodes existantes (addBook, registerUser, findBookByIsbn, findUserById, borrowBook, returnBook) et ajoutez ces nouvelles méthodes de recherche :searchByTitle(String keyword)- renvoie uneArrayList<Book>contenant tous les livres dont le titre contient le mot-clé (sans distinction entre majuscules et minuscules). UtiliseztoLowerCase()sur le titre et le mot-clé pour effectuer la comparaison.searchByAuthor(String keyword)- renvoie uneArrayList<Book>contenant tous les livres dont le nom de l'auteur contient le mot-clé (sans distinction entre majuscules et minuscules).getAvailableBooks()- renvoie uneArrayList<Book>contenant uniquement les livres actuellement disponibles à l'emprunt.Main.java: présentez votre système de recherche ! Vous recevrez les informations de trois livres (ISBN, titre, auteur pour chacun), puis celles d'un utilisateur (ID, nom), suivies d'une opération d'emprunt et de deux requêtes de recherche.Créez une Library, ajoutez-y les trois livres et enregistrez l'utilisateur. Traitez l'opération d'emprunt (au format
userId:isbn). Effectuez ensuite les deux recherches : la première entrée est un mot-clé de titre, la seconde un mot-clé d'auteur.Affichez les résultats dans cet ordre :
- Après l'emprunt, affichez la confirmation de l'emprunt
- Affichez
Title search '[keyword]':, puis les détails de chaque livre correspondant sur des lignes séparées (en utilisant getDetails()). S'il n'y a aucun résultat, affichezNo books found - Affichez
Author search '[keyword]':, puis les détails de chaque livre correspondant. S'il n'y a aucun résultat, affichezNo books found - Affichez
Available books:, puis les détails de chaque livre disponible
Vous recevrez les entrées dans cet ordre : ISBN de book1, titre de book1, auteur de book1, ISBN de book2, titre de book2, auteur de book2, ISBN de book3, titre de book3, auteur de book3, ID de l'utilisateur, nom de l'utilisateur, opération d'emprunt, mot-clé de recherche de titre, mot-clé de recherche d'auteur.
Par exemple, avec les entrées ISBN-001, Clean Code, Robert Martin, ISBN-002, The Clean Coder, Robert Martin, ISBN-003, Design Patterns, Gang of Four, U001, Alice, U001:ISBN-001, clean, martin, votre sortie serait :
Alice borrowed Clean Code
Title search 'clean':
[ISBN-001] Clean Code by Robert Martin
[ISBN-002] The Clean Coder by Robert Martin
Author search 'martin':
[ISBN-001] Clean Code by Robert Martin
[ISBN-002] The Clean Coder by Robert Martin
Available books:
[ISBN-002] The Clean Coder by Robert Martin
[ISBN-003] Design Patterns by Gang of FourRemarquez comment les méthodes de recherche utilisent une correspondance insensible à la casse : rechercher « clean » trouve à la fois « Clean Code » et « The Clean Coder ». La liste des livres disponibles exclut correctement le livre emprunté. Ces fonctionnalités de recherche transforment votre bibliothèque, qui n'était qu'une simple collection, en un système véritablement utilisable !
Essayez vous-même
import java.util.Scanner;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Lire les informations du livre 1
String isbn1 = scanner.nextLine();
String title1 = scanner.nextLine();
String author1 = scanner.nextLine();
// Lire les informations du livre 2
String isbn2 = scanner.nextLine();
String title2 = scanner.nextLine();
String author2 = scanner.nextLine();
// Lire les informations du livre 3
String isbn3 = scanner.nextLine();
String title3 = scanner.nextLine();
String author3 = scanner.nextLine();
// Lire les informations de l'utilisateur
String userId = scanner.nextLine();
String userName = scanner.nextLine();
// Lire l'opération d'emprunt
String borrowOp = scanner.nextLine();
// Lire les mots-clés de recherche
String titleKeyword = scanner.nextLine();
String authorKeyword = scanner.nextLine();
// Créer les objets Book
Book book1 = new Book(isbn1, title1, author1);
Book book2 = new Book(isbn2, title2, author2);
Book book3 = new Book(isbn3, title3, author3);
// Créer l'objet User
User user = new User(userId, userName);
// Créer Library et ajouter les livres et l'utilisateur
Library library = new Library();
library.addBook(book1);
library.addBook(book2);
library.addBook(book3);
library.registerUser(user);
// Traiter l'opération d'emprunt
String[] parts = borrowOp.split(":");
String opUserId = parts[0];
String opIsbn = parts[1];
library.borrowBook(opUserId, opIsbn);
// TODO: Recherche par titre
// Print "Title search '[titleKeyword]':"
// Utiliser library.searchByTitle(titleKeyword)
// Print each book's getDetails(), or "No books found" if empty
// TODO: Author search
// Print "Author search '[authorKeyword]':"
// Utiliser library.searchByAuthor(authorKeyword)
// Print each book's getDetails(), or "No books found" if empty
// TODO: Available books
// Print "Available books:"
// Use library.getAvailableBooks()
// Afficher getDetails() de chaque livre
}
}Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe mot-clé thisMéthodesChamps (Attributs)Méthode constructeurSurcharge de constructeurRécapitulatif - Calculatrice simple4Héritage
Héritage de base (extends)Le mot-clé superRedéfinition de méthode (@Override)Chaînage de constructeursLa classe ObjectHéritage simple et multiniveauPourquoi pas d'héritage multiple de classesRécapitulatif - Hiérarchie des employés7Méthodes spéciales et classe Object
Méthode toString()equals() et hashCode()Méthode clone()compareTo() et ComparableInterface ComparatorRécapitulatif - Tri personnalisé10Gestion des exceptions en POO
Hiérarchie des classes d'exceptionExceptions personnaliséesErreurs Checked vs UncheckedPattern Try-with-resourcesRécapitulatif - Utilisateur validé13Projet : Gestion de bibliothèque
Présentation du projet et conception UMLClasses Livre et UtilisateurSystème d'empruntFonctionnalité de rechercheInterface administrateurIntégration de la gestion des exceptionsTests et intégration2Modificateurs d'accès et Encapsulation
Aperçu des niveaux d'accèsMéthodes Getter et SetterMasquage d'informationsLe mot-clé finalRécapitulatif - Gestionnaire de compte bancaire5Polymorphisme
Bases de la surcharge de méthodesRedéfinition de méthodes (Run-Time)Upcasting et DowncastingL'opérateur instanceofClasses et méthodes abstraitesRécapitulatif - Calculateur de formes8Concepts avancés de la POO
Composition vs HéritageAgrégation vs CompositionClasses internes, imbriquées et anonymesEnums et méthodes d'EnumRecords (Java 16+)Classes scellées (Java 17+)11Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron MonteurPatron ObservateurPatron Stratégie3Propriétés de classe et membres statiques
Variables d'instance vs variables statiquesMéthodes statiquesBlocs statiquesConstantes (static final)Récapitulatif - Compteur et utilitaire6Interfaces et Classes Abstraites
Introduction aux InterfacesImplémentation d'InterfacesImplémentation d'Interfaces MultiplesDefault et Static dans les InterfacesClasses Abstraites vs InterfacesInterfaces FonctionnellesRécapitulatif - Système de Paiement9La généricité
Introduction à la généricitéClasses génériquesMéthodes génériquesParamètres de type bornésWildcards (?, extends, super)Récapitulatif - Conteneur générique12Patrons de conception, partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Template MethodPatron ÉtatPatron CompositePatron ItérateurEntraînez-vous par vous-même : Compilateur Java en ligne