Suchfunktionalität
Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy. Lektion 80 von 87.
Aufgabe
EinfachErweitern wir dein Bibliotheksverwaltungssystem um leistungsstarke Suchfunktionen! Eine Bibliothek ist nicht besonders nützlich, wenn Benutzer die gesuchten Bücher nicht finden können. Du wirst Methoden zur Suche nach Titel und Autor hinzufügen und deine Bibliothek dadurch wirklich funktional machen.
Du wirst deinen vorhandenen Code über vier Dateien hinweg weiter ausbauen:
Book.java: Behalte deine Book-Klasse mit allen bestehenden Funktionen bei: isbn, title, author, isAvailable, borrowedBy, getDetails() sowie den entsprechenden Gettern/Settern. Stelle sicher, dass du Getter-Methoden fürtitleundauthorhast, falls du sie noch nicht hinzugefügt hast.User.java: Behalte deine User-Klasse unverändert bei, mit id, name, der borrowedBooks ArrayList, borrowBook(), returnBook(), getBorrowedCount() und toString().Library.java: Erweitere deine Library-Klasse um Suchfunktionen. Behalte alle vorhandenen Methoden (addBook, registerUser, findBookByIsbn, findUserById, borrowBook, returnBook) bei und füge diese neuen Suchmethoden hinzu:searchByTitle(String keyword)– gibt eineArrayList<Book>zurück, die alle Bücher enthält, deren Titel das Schlüsselwort enthält (ohne Beachtung der Groß- und Kleinschreibung). VerwendetoLowerCase()sowohl für den Titel als auch für das Schlüsselwort zum Vergleich.searchByAuthor(String keyword)– gibt eineArrayList<Book>zurück, die alle Bücher enthält, deren Autorenname das Schlüsselwort enthält (ohne Beachtung der Groß- und Kleinschreibung).getAvailableBooks()– gibt eineArrayList<Book>zurück, die nur die Bücher enthält, die derzeit zum Ausleihen verfügbar sind.Main.java: Führe dein Suchsystem vor! Du erhältst Eingaben für drei Bücher (ISBN, Titel, Autor für jedes Buch), anschließend für einen Benutzer (ID, Name), gefolgt von einem Ausleihvorgang und zwei Suchanfragen.Erstelle eine Library, füge alle drei Bücher hinzu und registriere den Benutzer. Verarbeite den Ausleihvorgang (formatiert als
userId:isbn). Führe anschließend die beiden Suchen durch: Die erste Eingabe ist ein Titel-Schlüsselwort, die zweite ein Autoren-Schlüsselwort.Gib die Ergebnisse in dieser Reihenfolge aus:
- Gib nach dem Ausleihen die Bestätigung des Ausleihvorgangs aus
- Gib
Title search '[keyword]':aus, gefolgt von den Details jedes passenden Buchs in separaten Zeilen (mit getDetails()). Wenn es keine Treffer gibt, gibNo books foundaus - Gib
Author search '[keyword]':aus, gefolgt von den Details jedes passenden Buchs. Wenn es keine Treffer gibt, gibNo books foundaus - Gib
Available books:aus, gefolgt von den Details jedes verfügbaren Buchs
Du erhältst die Eingaben in dieser Reihenfolge: book1 ISBN, book1 Titel, book1 Autor, book2 ISBN, book2 Titel, book2 Autor, book3 ISBN, book3 Titel, book3 Autor, Benutzer-ID, Benutzername, Ausleihvorgang, Titel-Suchschlüsselwort, Autoren-Suchschlüsselwort.
Bei den Eingaben 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 würde deine Ausgabe beispielsweise so aussehen:
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 FourBeachte, wie die Suchmethoden eine Suche ohne Beachtung der Groß- und Kleinschreibung verwenden: Die Suche nach „clean“ findet sowohl „Clean Code“ als auch „The Clean Coder“. Die Liste der verfügbaren Bücher schließt das ausgeliehene Buch korrekt aus. Diese Suchfunktionen verwandeln deine Bibliothek von einer einfachen Sammlung in ein wirklich nutzbares System!
Probier es selbst
import java.util.Scanner;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Informationen zu Buch 1 lesen
String isbn1 = scanner.nextLine();
String title1 = scanner.nextLine();
String author1 = scanner.nextLine();
// Informationen zu Buch 2 lesen
String isbn2 = scanner.nextLine();
String title2 = scanner.nextLine();
String author2 = scanner.nextLine();
// Informationen zu Buch 3 lesen
String isbn3 = scanner.nextLine();
String title3 = scanner.nextLine();
String author3 = scanner.nextLine();
// Benutzerinformationen lesen
String userId = scanner.nextLine();
String userName = scanner.nextLine();
// Ausleihvorgang lesen
String borrowOp = scanner.nextLine();
// Suchschlüsselwörter lesen
String titleKeyword = scanner.nextLine();
String authorKeyword = scanner.nextLine();
// Book-Objekte erstellen
Book book1 = new Book(isbn1, title1, author1);
Book book2 = new Book(isbn2, title2, author2);
Book book3 = new Book(isbn3, title3, author3);
// User-Objekt erstellen
User user = new User(userId, userName);
// Library erstellen und Bücher und Benutzer hinzufügen
Library library = new Library();
library.addBook(book1);
library.addBook(book2);
library.addBook(book3);
library.registerUser(user);
// Ausleihvorgang verarbeiten
String[] parts = borrowOp.split(":");
String opUserId = parts[0];
String opIsbn = parts[1];
library.borrowBook(opUserId, opIsbn);
// TODO: Titelsuche
// Print "Title search '[titleKeyword]':"
// library.searchByTitle(titleKeyword) verwenden
// Print each book's getDetails(), or "No books found" if empty
// TODO: Author search
// Print "Author search '[authorKeyword]':"
// Verwende library.searchByAuthor(authorKeyword)
// Print each book's getDetails(), or "No books found" if empty
// TODO: Available books
// Print "Available books:"
// Use library.getAvailableBooks()
// Gib getDetails() jedes Buches aus
}
}Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas Schlüsselwort thisMethodenFelder (Attribute)KonstruktormethodeÜberladen von KonstruktorenRückblick – Einfacher Taschenrechner4Vererbung
Grundlegende Vererbung (extends)Das Schlüsselwort superÜberschreiben von Methoden (@Override)KonstruktorverkettungDie Object-KlasseEinfach- und mehrstufige VererbungWarum keine Mehrfachvererbung von KlassenRückblick – Mitarbeiterhierarchie7Spezielle Methoden & Object-Klasse
toString()-Methodeequals() und hashCode()clone()-MethodecompareTo() und ComparableComparator-SchnittstelleRückblick – Benutzerdefinierte Sortierung10Exception Handling in OOP
Hierarchie der Exception-KlassenBenutzerdefinierte ExceptionsGeprüfte vs. ungeprüfte FehlerTry-with-Resources-MusterRückblick – Validierter Benutzer13Projekt: Bibliotheksverwaltung
Projektübersicht & UML-EntwurfBuch- und BenutzerklassenAusleihsystemSuchfunktionalitätAdministrationsoberflächeIntegration der AusnahmebehandlungTesten und Integration2Zugriffsmodifikatoren & Kapselung
Übersicht der ZugriffsebenenGetter- und Setter-MethodenInformationsverbergungDas Schlüsselwort finalRückblick – Bankkontoverwaltung5Polymorphismus
Grundlagen der MethodenüberladungMethodenüberschreibung (Laufzeit)Upcasting und DowncastingDer instanceof-OperatorAbstrakte Klassen und MethodenRückblick – Formrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungAggregation vs. KompositionInnere, verschachtelte & anonyme KlassenEnums und Enum-MethodenRecords (Java 16+)Versiegelte Klassen (Java 17+)11Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterBuilder-MusterObserver-MusterStrategie-Muster14Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungsdienst3Klassen-Props & statische Member
Instanz- vs. statische VariablenStatische MethodenStatische BlöckeKonstanten (static final)Wiederholung – Counter & Utility6Schnittstellen & abstrakte Klassen
Einführung in InterfacesInterfaces implementierenMehrere Interfaces implementierenDefault & Static in InterfacesAbstrakte Klassen vs. InterfacesFunktionale InterfacesRückblick – ZahlungssystemÜbe selbstständig: Online-Java-Compiler