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 capacité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 allez ajouter des méthodes pour effectuer des recherches par titre et par auteur, rendant votre bibliothèque véritablement fonctionnelle.
Vous continuerez à construire sur votre code existant à travers quatre fichiers :
Book.java: Conservez votre classe Book avec toutes les fonctionnalités existantes — isbn, title, author, isAvailable, borrowedBy, getDetails(), et les getters/setters appropriés. Assurez-vous d'avoir des méthodes getter pourtitleetauthorsi vous ne les avez pas encore ajoutées.User.java: Conservez votre classe User inchangée avec id, name, l'ArrayList borrowedBooks, borrowBook(), returnBook(), getBorrowedCount(), et toString().Library.java: Étendez 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)- retourne uneArrayList<Book>contenant tous les livres dont le titre contient le mot-clé (insensible à la casse). UtiliseztoLowerCase()sur le titre et le mot-clé pour la comparaison.searchByAuthor(String keyword)- retourne uneArrayList<Book>contenant tous les livres dont le nom de l'auteur contient le mot-clé (insensible à la casse).getAvailableBooks()- retourne uneArrayList<Book>contenant uniquement les livres qui sont actuellement disponibles pour l'emprunt.Main.java: Démontrez votre système de recherche ! Vous recevrez des entrées pour trois livres (ISBN, titre, auteur pour chacun), puis un utilisateur (ID, nom), suivi d'une opération d'emprunt et de deux requêtes de recherche.Créez une Library, ajoutez les trois livres et enregistrez l'utilisateur. Traitez l'opération d'emprunt (formatée comme
userId:isbn). Effectuez ensuite les deux recherches — la première entrée est un mot-clé pour le titre, la seconde est un mot-clé pour l'auteur.Affichez les résultats dans cet ordre :
- Après l'emprunt, affichez la confirmation d'emprunt
- Affichez
Title search '[keyword]':suivi des détails de chaque livre correspondant sur des lignes séparées (en utilisant getDetails()). Si aucune correspondance n'est trouvée, affichezNo books found - Affichez
Author search '[keyword]':suivi des détails de chaque livre correspondant. Si aucune correspondance n'est trouvée, affichezNo books found - Affichez
Available books:suivi des détails de chaque livre disponible
Vous recevrez les entrées dans cet ordre : book1 ISBN, book1 title, book1 author, book2 ISBN, book2 title, book2 author, book3 ISBN, book3 title, book3 author, user ID, user name, opération d'emprunt, mot-clé de recherche par titre, mot-clé de recherche par 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 — la recherche de "clean" trouve à la fois "Clean Code" et "The Clean Coder". La liste des livres disponibles exclut correctement le livre emprunté. Ces capacités de recherche transforment votre bibliothèque d'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 la bibliothèque 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
// Afficher "Title search '[titleKeyword]':"
// Utiliser library.searchByTitle(titleKeyword)
// Afficher le getDetails() de chaque livre, ou "No books found" si vide
// TODO : Recherche par auteur
// Afficher "Author search '[authorKeyword]':"
// Utiliser library.searchByAuthor(authorKeyword)
// Afficher le getDetails() de chaque livre, ou "No books found" si vide
// TODO : Livres disponibles
// Afficher "Available books:"
// Utiliser library.getAvailableBooks()
// Afficher le 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 Utilisateur2Modificateurs 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érateur