Funkcja wyszukiwania
Część sekcji Programowanie obiektowe ścieżki Java w Coddy. Lekcja 80 z 87.
Wyzwanie
ŁatwyRozbudujmy Twój system zarządzania biblioteką o zaawansowane możliwości wyszukiwania! Biblioteka nie jest zbyt przydatna, jeśli użytkownicy nie mogą znaleźć książek, których szukają. Dodasz metody wyszukiwania według tytułu i autora, dzięki czemu Twoja biblioteka stanie się w pełni funkcjonalna.
Będziesz dalej rozwijać istniejący kod w czterech plikach:
Book.java: Zachowaj swoją klasę Book ze wszystkimi dotychczasowymi funkcjami: isbn, title, author, isAvailable, borrowedBy, getDetails() oraz odpowiednimi metodami pobierającymi i ustawiającymi. Upewnij się, że masz metody pobierające dlatitleiauthor, jeśli jeszcze ich nie dodano.User.java: Pozostaw klasę User bez zmian, z id, name, tablicą ArrayList borrowedBooks, metodami borrowBook(), returnBook(), getBorrowedCount() oraz toString().Library.java: Rozbuduj klasę Library o funkcje wyszukiwania. Zachowaj wszystkie istniejące metody (addBook, registerUser, findBookByIsbn, findUserById, borrowBook, returnBook) i dodaj następujące nowe metody wyszukiwania:searchByTitle(String keyword)— zwracaArrayList<Book>zawierającą wszystkie książki, których tytuł zawiera słowo kluczowe (bez rozróżniania wielkości liter). Do porównania użyjtoLowerCase()zarówno dla tytułu, jak i słowa kluczowego.searchByAuthor(String keyword)— zwracaArrayList<Book>zawierającą wszystkie książki, których nazwisko autora zawiera słowo kluczowe (bez rozróżniania wielkości liter).getAvailableBooks()— zwracaArrayList<Book>zawierającą tylko książki, które są obecnie dostępne do wypożyczenia.Main.java: Zademonstruj działanie systemu wyszukiwania! Otrzymasz dane wejściowe dotyczące trzech książek (dla każdej: ISBN, tytuł, autor), następnie użytkownika (ID, imię), a po nich operację wypożyczenia i dwa zapytania wyszukiwania.Utwórz obiekt Library, dodaj wszystkie trzy książki i zarejestruj użytkownika. Wykonaj operację wypożyczenia (w formacie
userId:isbn). Następnie przeprowadź dwa wyszukiwania: pierwsze dane wejściowe to słowo kluczowe będące tytułem, a drugie to słowo kluczowe będące nazwiskiem autora.Wyświetl wyniki w następującej kolejności:
- Po wypożyczeniu wyświetl potwierdzenie wypożyczenia
- Wyświetl
Title search '[keyword]':, a następnie szczegóły każdej pasującej książki, w osobnych wierszach (używając getDetails()). Jeśli nie ma pasujących książek, wyświetlNo books found - Wyświetl
Author search '[keyword]':, a następnie szczegóły każdej pasującej książki. Jeśli nie ma pasujących książek, wyświetlNo books found - Wyświetl
Available books:, a następnie szczegóły każdej dostępnej książki
Otrzymasz dane wejściowe w następującej kolejności: ISBN książki book1, tytuł książki book1, autor książki book1, ISBN książki book2, tytuł książki book2, autor książki book2, ISBN książki book3, tytuł książki book3, autor książki book3, ID użytkownika, imię użytkownika, operacja wypożyczenia, słowo kluczowe wyszukiwania tytułu, słowo kluczowe wyszukiwania autora.
Na przykład dla danych wejściowych 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 wynikiem będzie:
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 FourZwróć uwagę, że metody wyszukiwania dopasowują tekst bez rozróżniania wielkości liter: wyszukanie "clean" znajduje zarówno "Clean Code", jak i "The Clean Coder". Lista dostępnych książek prawidłowo pomija wypożyczoną książkę. Te możliwości wyszukiwania przekształcają Twoją bibliotekę ze zwykłego zbioru książek w naprawdę użyteczny system!
Spróbuj swoich sił
import java.util.Scanner;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Wczytaj informacje o książce 1
String isbn1 = scanner.nextLine();
String title1 = scanner.nextLine();
String author1 = scanner.nextLine();
// Wczytaj informacje o książce 2
String isbn2 = scanner.nextLine();
String title2 = scanner.nextLine();
String author2 = scanner.nextLine();
// Wczytaj informacje o książce 3
String isbn3 = scanner.nextLine();
String title3 = scanner.nextLine();
String author3 = scanner.nextLine();
// Wczytaj informacje o użytkowniku
String userId = scanner.nextLine();
String userName = scanner.nextLine();
// Wczytaj operację wypożyczenia
String borrowOp = scanner.nextLine();
// Wczytaj słowa kluczowe do wyszukiwania
String titleKeyword = scanner.nextLine();
String authorKeyword = scanner.nextLine();
// Utwórz obiekty Book
Book book1 = new Book(isbn1, title1, author1);
Book book2 = new Book(isbn2, title2, author2);
Book book3 = new Book(isbn3, title3, author3);
// Utwórz obiekt User
User user = new User(userId, userName);
// Utwórz obiekt Library i dodaj książki oraz użytkownika
Library library = new Library();
library.addBook(book1);
library.addBook(book2);
library.addBook(book3);
library.registerUser(user);
// Przetwórz operację wypożyczenia
String[] parts = borrowOp.split(":");
String opUserId = parts[0];
String opIsbn = parts[1];
library.borrowBook(opUserId, opIsbn);
// TODO: Wyszukiwanie według tytułu
// Wypisz "Title search '[titleKeyword]':"
// Użyj library.searchByTitle(titleKeyword)
// Wypisz getDetails() każdej książki lub "No books found", jeśli wynik jest pusty
// TODO: Wyszukiwanie według autora
// Wypisz "Author search '[authorKeyword]':"
// Użyj library.searchByAuthor(authorKeyword)
// Wypisz getDetails() każdej książki lub "No books found", jeśli wynik jest pusty
// TODO: Dostępne książki
// Wypisz "Available books:"
// Użyj library.getAvailableBooks()
// Wypisz getDetails() każdej książki
}
}Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe thisMetodyPola (atrybuty)Metoda konstruktoraPrzeciążanie konstruktoraPodsumowanie — prosty kalkulator4Dziedziczenie
Podstawy dziedziczenia (extends)Słowo kluczowe superPrzesłanianie metod (@Override)Łańcuch wywołań konstruktorówKlasa ObjectDziedziczenie jedno- i wielopoziomoweDlaczego Java nie obsługuje wielodziedziczenia klasPodsumowanie – hierarchia pracowników7Metody specjalne i klasa Object
Metoda toString()equals() i hashCode()Metoda clone()compareTo() i ComparableInterfejs ComparatorPodsumowanie — własne sortowanie10Obsługa wyjątków w programowaniu obiektowym
Hierarchia klas wyjątkówWłasne wyjątkiBłędy sprawdzane a niesprawdzaneWzorzec try-with-resourcesPodsumowanie – zweryfikowany użytkownik13Projekt: System zarządzania biblioteką
Przegląd projektu i projekt UMLKlasy książki i użytkownikaSystem wypożyczeńFunkcja wyszukiwaniaInterfejs administratoraIntegracja obsługi wyjątkówTestowanie i integracja2Modyfikatory dostępu i enkapsulacja
Przegląd poziomów dostępuMetody pobierające i ustawiająceUkrywanie informacjiSłowo kluczowe finalPodsumowanie — menedżer kont bankowych5Polimorfizm
Podstawy przeciążania metodPrzesłanianie metod (w czasie wykonywania)Rzutowanie w górę i w dółOperator instanceofKlasy i metody abstrakcyjnePowtórka — kalkulator figur8Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieAgregacja a kompozycjaKlasy wewnętrzne, zagnieżdżone i anonimoweEnumy i metody enumówRekordy (Java 16+)Klasy zapieczętowane (Java 17+)11Wzorce projektowe — część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec BuilderWzorzec ObserverWzorzec Strategy3Właściwości klas i składowe statyczne
Zmienne instancji a zmienne statyczneMetody statyczneBloki statyczneStałe (static final)Powtórka – Counter i Utility6Interfejsy i klasy abstrakcyjne
Wprowadzenie do interfejsówImplementowanie interfejsówImplementacja wielu interfejsówMetody domyślne i statyczne w interfejsieKlasy abstrakcyjne a interfejsyInterfejsy funkcyjnePodsumowanie — system płatnościPoćwicz samodzielnie: Kompilator Java online