פונקציונליות חיפוש
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Java של Coddy. שיעור 80 מתוך 87.
אתגר
קלבואו נשדרג את מערכת ניהול הספרייה שלך עם יכולות חיפוש עוצמתיות! ספרייה אינה שימושית במיוחד אם המשתמשים לא יכולים למצוא את הספרים שהם מחפשים. תוסיף שיטות לחיפוש לפי כותרת ומחבר, וכך תהפוך את הספרייה שלך לשימושית באמת.
תמשיך לבנות על הקוד הקיים שלך בארבעה קבצים:
Book.java: השאר את מחלקת Book שלך עם כל הפונקציונליות הקיימת: isbn, title, author, isAvailable, borrowedBy, getDetails(), וה־getters/setters המתאימים. ודא שיש לך שיטות getter עבורtitleו־author, אם עדיין לא הוספת אותן.User.java: השאר את מחלקת User ללא שינוי, עם id, name, מערך ה־ArrayList בשם borrowedBooks, והשיטות borrowBook(), returnBook(), getBorrowedCount(), ו־toString().Library.java: הרחב את מחלקת Library שלך עם יכולת חיפוש. השאר את כל השיטות הקיימות (addBook, registerUser, findBookByIsbn, findUserById, borrowBook, returnBook) והוסף את שיטות החיפוש החדשות האלה:searchByTitle(String keyword)- מחזירהArrayList<Book>שמכיל את כל הספרים שהכותרת שלהם מכילה את מילת המפתח (ללא תלות באותיות גדולות וקטנות). השתמש ב־toLowerCase()גם על הכותרת וגם על מילת המפתח לצורך ההשוואה.searchByAuthor(String keyword)- מחזירהArrayList<Book>שמכיל את כל הספרים ששם המחבר שלהם מכיל את מילת המפתח (ללא תלות באותיות גדולות וקטנות).getAvailableBooks()- מחזירהArrayList<Book>שמכיל רק את הספרים שזמינים כרגע להשאלה.Main.java: הדגם את מערכת החיפוש שלך! יתקבלו קלטים עבור שלושה ספרים (ISBN, כותרת, מחבר עבור כל אחד), לאחר מכן משתמש (מזהה, שם), ואחריהם פעולת השאלה ושתי שאילתות חיפוש.צור Library, הוסף את שלושת הספרים ורשום את המשתמש. בצע את פעולת ההשאלה (בפורמט
userId:isbn). לאחר מכן בצע את שני החיפושים: הקלט הראשון הוא מילת מפתח של כותרת, והשני הוא מילת מפתח של מחבר.הדפס את התוצאות בסדר הזה:
- לאחר ההשאלה, הדפס את אישור ההשאלה
- הדפס
Title search '[keyword]':ולאחריו את פרטי כל ספר תואם בשורה נפרדת (באמצעות getDetails()). אם אין התאמות, הדפסNo books found - הדפס
Author search '[keyword]':ולאחריו את פרטי כל ספר תואם. אם אין התאמות, הדפסNo books found - הדפס
Available books:ולאחריו את פרטי כל ספר זמין
הקלטים יתקבלו בסדר הזה: ISBN של book1, כותרת של book1, מחבר של book1, ISBN של book2, כותרת של book2, מחבר של book2, ISBN של book3, כותרת של book3, מחבר של book3, מזהה המשתמש, שם המשתמש, פעולת השאלה, מילת מפתח לחיפוש כותרת, מילת מפתח לחיפוש מחבר.
לדוגמה, עבור הקלטים 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, הפלט יהיה:
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 Fourשים לב ששיטות החיפוש משתמשות בהתאמה שאינה תלויה באותיות גדולות וקטנות: חיפוש אחר "clean" מוצא גם את "Clean Code" וגם את "The Clean Coder". רשימת הספרים הזמינים אינה כוללת כראוי את הספר שהושאל. יכולות החיפוש האלה הופכות את הספרייה שלך מאוסף פשוט למערכת שימושית באמת!
נסו בעצמכם
import java.util.Scanner;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// קרא את פרטי ספר 1
String isbn1 = scanner.nextLine();
String title1 = scanner.nextLine();
String author1 = scanner.nextLine();
// קרא את פרטי ספר 2
String isbn2 = scanner.nextLine();
String title2 = scanner.nextLine();
String author2 = scanner.nextLine();
// קרא את פרטי ספר 3
String isbn3 = scanner.nextLine();
String title3 = scanner.nextLine();
String author3 = scanner.nextLine();
// קרא את פרטי המשתמש
String userId = scanner.nextLine();
String userName = scanner.nextLine();
// קרא את פעולת ההשאלה
String borrowOp = scanner.nextLine();
// קרא את מילות המפתח לחיפוש
String titleKeyword = scanner.nextLine();
String authorKeyword = scanner.nextLine();
// צור אובייקטים מסוג Book
Book book1 = new Book(isbn1, title1, author1);
Book book2 = new Book(isbn2, title2, author2);
Book book3 = new Book(isbn3, title3, author3);
// צור אובייקט מסוג User
User user = new User(userId, userName);
// צור אובייקט מסוג Library והוסף ספרים ומשתמש
Library library = new Library();
library.addBook(book1);
library.addBook(book2);
library.addBook(book3);
library.registerUser(user);
// עבד את פעולת ההשאלה
String[] parts = borrowOp.split(":");
String opUserId = parts[0];
String opIsbn = parts[1];
library.borrowBook(opUserId, opIsbn);
// TODO: חיפוש לפי כותרת
// הדפס "Title search '[titleKeyword]':"
// השתמשו ב-library.searchByTitle(titleKeyword)
// הדפיסו את getDetails() של כל ספר, או "No books found" אם אין תוצאות
// TODO: חיפוש לפי מחבר
// הדפיסו "Author search '[authorKeyword]':"
// השתמשו ב-library.searchByAuthor(authorKeyword)
// הדפיסו את getDetails() של כל ספר, או "No books found" אם אין תוצאות
// TODO: ספרים זמינים
// הדפיסו "Available books:"
// השתמשו ב-library.getAvailableBooks()
// הדפיסו את getDetails() של כל ספר
}
}כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמבוא לתכנות מונחה עצמיםמחלקות לעומת אובייקטיםמילת המפתח thisמתודותשדות (מאפיינים)מתודת הבנאיהעמסת בנאיםחזרה – מחשבון פשוט4ירושה
ירושה בסיסית (extends)מילת המפתח superדריסת מתודות (@Override)שרשור בנאיםהמחלקה Objectירושה יחידה ורב־רמתיתלמה אין ירושה מרובה של מחלקותסיכום – היררכיית עובדים7מתודות מיוחדות ומחלקת Object
מתודת toString()equals() ו-hashCode()מתודת clone()compareTo() ו-Comparableהממשק Comparatorסיכום – מיון מותאם אישית10טיפול בחריגות ב-OOP
היררכיית מחלקות החריגותחריגות מותאמות אישיתשגיאות Checked לעומת Uncheckedתבנית Try With Resourcesחזרה – משתמש מאומת13פרויקט: ניהול ספרייה
סקירת הפרויקט ותכנון UMLמחלקות ספר ולקוחמערכת השאלת ספריםפונקציונליות חיפושממשק מנהלשילוב טיפול בחריגותבדיקות ושילוב2מצייני גישה ואנקפסולציה
סקירה של רמות הגישהמתודות Getter ו-Setterהסתרת מידעמילת המפתח finalסיכום – מנהל חשבון בנק5פולימורפיזם
יסודות העמסת מתודותדריסת מתודות (בזמן ריצה)המרה כלפי מעלה וכלפי מטההאופרטור instanceofמחלקות ומתודות מופשטותסיכום – מחשבון צורות8מושגי OOP מתקדמים
הרכבה מול ירושהאגרגציה מול הרכבהמחלקות פנימיות, מקוננות ואנונימיותEnums ומתודות של EnumRecords (Java 16+)מחלקות חתומות (Java 17+)3מאפייני מחלקה וחברים סטטיים
משתני מופע לעומת משתנים סטטייםמתודות סטטיותבלוקים סטטייםקבועים (static final)סיכום — מונה ומחלקת עזר6ממשקים ומחלקות מופשטות
מבוא לממשקיםמימוש ממשקיםמימוש של כמה ממשקיםמתודות ברירת מחדל וסטטיות בממשקמחלקות מופשטות לעומת ממשקיםממשקים פונקציונלייםסיכום – מערכת תשלומיםתרגלו בעצמכם: קומפיילר Java אונליין