خاصية البحث
جزء من قسم Object Oriented Programming في رحلة Java على Coddy — الدرس 80 من 87.
التحدي
سهللنقم بتحسين نظام إدارة المكتبة الخاص بك بقدرات بحث قوية! فالمكتبة لا تكون مفيدة للغاية إذا لم يتمكن المستخدمون من العثور على الكتب التي يبحثون عنها. ستضيف طرقاً (methods) للبحث حسب العنوان والمؤلف، مما يجعل مكتبتك وظيفية حقاً.
ستستمر في البناء على كودك الحالي عبر أربعة ملفات:
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، العنوان، المؤلف لكل منها)، ثم مستخدم (ID، الاسم)، تليها عملية استعارة واستعلامي بحث.قم بإنشاء Library، وأضف الكتب الثلاثة جميعاً، وسجل المستخدم. قم بمعالجة عملية الاستعارة (بتنسيق
userId:isbn). ثم قم بإجراء عمليتي البحث—المدخل الأول هو كلمة مفتاحية للعنوان، والثاني هو كلمة مفتاحية للمؤلف.اطبع النتائج بهذا الترتيب:
- بعد الاستعارة، اطبع تأكيد الاستعارة
- اطبع
Title search '[keyword]':متبوعاً بتفاصيل كل كتاب مطابق في أسطر منفصلة (باستخدام getDetails()). إذا لم تكن هناك مطابقات، اطبعNo books found - اطبع
Author search '[keyword]':متبوعاً بتفاصيل كل كتاب مطابق. إذا لم تكن هناك مطابقات، اطبعNo books found - اطبع
Available books:متبوعاً بتفاصيل كل كتاب متاح
ستتلقى المدخلات بهذا الترتيب: book1 ISBN، book1 title، book1 author، book2 ISBN، book2 title، book2 author، book3 ISBN، book3 title، book3 author، user ID، user name، عملية الاستعارة، الكلمة المفتاحية للبحث عن العنوان، الكلمة المفتاحية للبحث عن المؤلف.
على سبيل المثال، مع المدخلات 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 = 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() لكل كتاب
}
}جميع دروس Object Oriented Programming
1أساسيات الـ OOP
الملفات الخارجيةمقدمة في الـ OOPالفئات (Classes) مقابل الكائنات (Objects)الكلمة المفتاحية thisالدوال (Methods)الحقول (Attributes)دالة البناء (Constructor)تعدد أشكال دالة البناء (Constructor Overloading)مراجعة - آلة حاسبة بسيطة4الوراثة
الوراثة الأساسية (extends)الكلمة المفتاحية superإعادة تعريف الدوال (@Override)تسلسل المنشئات (Constructor Chaining)كلاس Objectالوراثة الأحادية ومتعددة المستوياتلماذا لا توجد وراثة متعددة للكلاساتمراجعة - هيكلية الموظفين7الدوال الخاصة وفئة Object
دالة toString()equals() و hashCode()دالة clone()compareTo() و Comparableواجهة Comparatorمراجعة - الترتيب المخصص10معالجة الاستثناءات في OOP
التسلسل الهرمي لفئات الاستثناءاتالاستثناءات المخصصةالأخطاء من نوع Checked مقابل Uncheckedنمط Try With Resourcesمراجعة - Validated User13مشروع: إدارة المكتبة
نظرة عامة على المشروع وتصميم UMLفئات الكتاب والمستخدم2محددات الوصول والتغليف
نظرة عامة على مستويات الوصولدوال Getter و Setterإخفاء البياناتالكلمة المفتاحية finalمراجعة - مدير الحساب البنكي5تعدد الأشكال (Polymorphism)
أساسيات الـ Method Overloadingالـ Method Overriding (في وقت التشغيل)الـ Upcasting والـ Downcastingمعامل الـ instanceofالفئات والدوال المجردة (Abstract)مراجعة - حاسبة الأشكال8مفاهيم OOP المتقدمة
الـ Composition مقابل الـ Inheritanceالـ Aggregation مقابل الـ Compositionالفئات الداخلية والمتداخلة والمجهولة (Inner, Nested & Anonymous)الـ Enums ودوالهاالـ Records (Java 16+)الـ Sealed Classes (Java 17+)11أنماط التصميم - الجزء الأول
مقدمة في أنماط التصميمنمط Singletonنمط Factoryنمط Builderنمط Observerنمط Strategy3خصائص الفئة والعضو الساكن
المتغيرات الخاصة بالكائن مقابل المتغيرات الساكنةالدوال الساكنةالكتل البرمجية الساكنةالثوابت (static final)ملخص - العداد والأدوات المساعدة6الواجهات (Interfaces) والأصناف المجردة (Abstract Classes)
مقدمة في الواجهات (Interfaces)تنفيذ الواجهات (Interfaces)تنفيذ واجهات متعددةالـ Default و Static في الواجهاتالأصناف المجردة مقابل الواجهاتالواجهات الوظيفية (Functional Interfaces)مراجعة - نظام الدفع9الأنواع العامة (Generics)
مقدمة في الأنواع العامةالأصناف العامة (Generic Classes)الدوال العامة (Generic Methods)معاملات الأنواع المقيدةالرموز البديلة (?, extends, super)مراجعة - الحاويات العامة12أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المكرر