Funzionalità di ricerca
Fa parte della sezione Programmazione orientata agli oggetti del percorso Java di Coddy. Lezione 80 di 87.
Sfida
FacileMiglioriamo il tuo sistema di gestione della biblioteca con potenti funzionalità di ricerca! Una biblioteca non è molto utile se gli utenti non riescono a trovare i libri che cercano. Aggiungerai metodi per cercare per titolo e autore, rendendo la tua biblioteca davvero funzionale.
Continuerai a sviluppare il codice esistente in quattro file:
Book.java: Mantieni la tua classe Book con tutte le funzionalità esistenti: isbn, title, author, isAvailable, borrowedBy, getDetails() e i getter/setter appropriati. Assicurati di avere i metodi getter pertitleeauthor, se non li hai già aggiunti.User.java: Mantieni invariata la tua classe User con id, name, l'ArrayList borrowedBooks, borrowBook(), returnBook(), getBorrowedCount() e toString().Library.java: Estendi la tua classe Library con le funzionalità di ricerca. Mantieni tutti i metodi esistenti (addBook, registerUser, findBookByIsbn, findUserById, borrowBook, returnBook) e aggiungi questi nuovi metodi di ricerca:searchByTitle(String keyword)- restituisce unArrayList<Book>contenente tutti i libri il cui titolo contiene la parola chiave (senza distinzione tra maiuscole e minuscole). UsatoLowerCase()sia sul titolo sia sulla parola chiave per il confronto.searchByAuthor(String keyword)- restituisce unArrayList<Book>contenente tutti i libri il cui autore contiene la parola chiave (senza distinzione tra maiuscole e minuscole).getAvailableBooks()- restituisce unArrayList<Book>contenente solo i libri attualmente disponibili per il prestito.Main.java: Mostra il funzionamento del sistema di ricerca! Riceverai i dati di tre libri (ISBN, titolo e autore per ciascuno), poi quelli di un utente (ID, nome), seguiti da un'operazione di prestito e da due query di ricerca.Crea una Library, aggiungi tutti e tre i libri e registra l'utente. Elabora l'operazione di prestito (nel formato
userId:isbn). Poi esegui le due ricerche: il primo input è una parola chiave del titolo, il secondo è una parola chiave dell'autore.Stampa i risultati in questo ordine:
- Dopo il prestito, stampa la conferma del prestito
- Stampa
Title search '[keyword]':seguito dai dettagli di ciascun libro corrispondente, su righe separate (usando getDetails()). Se non ci sono corrispondenze, stampaNo books found - Stampa
Author search '[keyword]':seguito dai dettagli di ciascun libro corrispondente. Se non ci sono corrispondenze, stampaNo books found - Stampa
Available books:seguito dai dettagli di ciascun libro disponibile
Riceverai gli input in questo ordine: ISBN di book1, titolo di book1, autore di book1, ISBN di book2, titolo di book2, autore di book2, ISBN di book3, titolo di book3, autore di book3, ID utente, nome utente, operazione di prestito, parola chiave per la ricerca del titolo, parola chiave per la ricerca dell'autore.
Ad esempio, con gli input 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, il tuo output sarebbe:
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 FourNota come i metodi di ricerca effettuano corrispondenze senza distinzione tra maiuscole e minuscole: cercando "clean" si trovano sia "Clean Code" sia "The Clean Coder". L'elenco dei libri disponibili esclude correttamente il libro preso in prestito. Queste funzionalità di ricerca trasformano la tua biblioteca da una semplice raccolta in un sistema davvero utilizzabile!
Provalo tu
import java.util.Scanner;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Leggi le informazioni del libro 1
String isbn1 = scanner.nextLine();
String title1 = scanner.nextLine();
String author1 = scanner.nextLine();
// Leggi le informazioni del libro 2
String isbn2 = scanner.nextLine();
String title2 = scanner.nextLine();
String author2 = scanner.nextLine();
// Leggi le informazioni del libro 3
String isbn3 = scanner.nextLine();
String title3 = scanner.nextLine();
String author3 = scanner.nextLine();
// Leggi le informazioni dell'utente
String userId = scanner.nextLine();
String userName = scanner.nextLine();
// Leggi l'operazione di prestito
String borrowOp = scanner.nextLine();
// Leggi le parole chiave di ricerca
String titleKeyword = scanner.nextLine();
String authorKeyword = scanner.nextLine();
// Crea gli oggetti Book
Book book1 = new Book(isbn1, title1, author1);
Book book2 = new Book(isbn2, title2, author2);
Book book3 = new Book(isbn3, title3, author3);
// Crea l'oggetto User
User user = new User(userId, userName);
// Crea Library e aggiungi i libri e l'utente
Library library = new Library();
library.addBook(book1);
library.addBook(book2);
library.addBook(book3);
library.registerUser(user);
// Elabora l'operazione di prestito
String[] parts = borrowOp.split(":");
String opUserId = parts[0];
String opIsbn = parts[1];
library.borrowBook(opUserId, opIsbn);
// TODO: Ricerca per titolo
// Stampa "Title search '[titleKeyword]':"
// Usa library.searchByTitle(titleKeyword)
// Stampa getDetails() per ogni libro, oppure "No books found" se non ci sono risultati
// TODO: Ricerca per autore
// Stampa "Author search '[authorKeyword]':"
// Usa library.searchByAuthor(authorKeyword)
// Stampa getDetails() per ogni libro, oppure "No books found" se non ci sono risultati
// TODO: Libri disponibili
// Stampa "Available books:"
// Usa library.getAvailableBooks()
// Stampa getDetails() per ogni libro
}
}Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione a oggetti
File esterniIntroduzione alla programmazione a oggettiClassi e oggettiLa parola chiave thisMetodiCampi (attributi)Metodo costruttoreSovraccarico dei costruttoriRipasso - Calcolatrice semplice4Ereditarietà
Ereditarietà di base (extends)La parola chiave superSovrascrittura dei metodi (@Override)Concatenamento dei costruttoriLa classe ObjectEreditarietà singola e multilivelloPerché non esiste l'ereditarietà multipla delle classiRiepilogo: gerarchia dei dipendenti7Metodi speciali e classe Object
Metodo toString()equals() e hashCode()Metodo clone()compareTo() e ComparableInterfaccia ComparatorRiepilogo - Ordinamento personalizzato10Gestione delle eccezioni in OOP
Gerarchia delle classi di eccezioneEccezioni personalizzateEccezioni controllate e non controllatePattern try-with-resourcesRiepilogo - Utente validato13Progetto: Gestione della biblioteca
Panoramica del progetto e progettazione UMLClassi Libro e UtenteSistema di prestitoFunzionalità di ricercaInterfaccia amministratoreIntegrazione della gestione delle eccezioniTest e integrazione2Modificatori di accesso e incapsulamento
Panoramica dei livelli di accessoMetodi getter e setterNascondimento delle informazioniLa parola chiave finalRiepilogo - Gestore di conti bancari5Polimorfismo
Nozioni di base sull'overloading dei metodiOverride dei metodi (a runtime)Upcasting e downcastingL'operatore instanceofClassi e metodi astrattiRiepilogo - Calcolatore di forme8Concetti avanzati di OOP
Composizione vs ereditarietàAggregazione vs composizioneClassi interne, annidate e anonimeEnum e metodi degli EnumRecord (Java 16+)Classi sealed (Java 17+)11Modelli di progettazione Parte 1
Introduzione ai modelli di progettazionePattern SingletonPattern FactoryPattern BuilderPattern ObserverPattern Strategy3Proprietà di classe e membri statici
Variabili di istanza e staticheMetodi staticiBlocchi staticiCostanti (static final)Riepilogo - Contatore e utility6Interfacce e classi astratte
Introduzione alle interfacceImplementazione delle interfacceImplementazione di più interfacceMetodi default e static nelle interfacceClassi astratte e interfacce a confrontoInterfacce funzionaliRiepilogo: sistema di pagamento9Tipi generici
Introduzione ai tipi genericiClassi genericheMetodi genericiParametri di tipo con limitiCaratteri jolly (?, extends, super)Riepilogo - Contenitore generico12Modelli di progettazione – Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern IteratorEsercitati da solo: Compilatore Java online