خاصية البحث
جزء من قسم البرمجة كائنية التوجه في رحلة Java على Coddy. الدرس 80 من 87.
التحدي
سهللنُحسّن نظام إدارة المكتبة لديك بقدرات بحث قوية! لا تكون المكتبة مفيدة جدًا إذا لم يتمكن المستخدمون من العثور على الكتب التي يبحثون عنها. ستضيف طرقًا للبحث حسب العنوان والمؤلف، مما يجعل مكتبتك عملية حقًا.
ستواصل البناء على التعليمات البرمجية الموجودة لديك عبر أربعة ملفات:
Book.java: احتفظ بفئة Book مع جميع الوظائف الموجودة: isbn وtitle وauthor وisAvailable وborrowedBy وgetDetails()، بالإضافة إلى دوال getter/setter المناسبة. تأكد من أن لديك دوال 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: البحث حسب العنوان
// Print "Title search '[titleKeyword]':"
// استخدام library.searchByTitle(titleKeyword)
// Print each book's getDetails(), or "No books found" if empty
// TODO: Author search
// Print "Author search '[authorKeyword]':"
// استخدم library.searchByAuthor(authorKeyword)
// Print each book's getDetails(), or "No books found" if empty
// TODO: Available books
// Print "Available books:"
// Use library.getAvailableBooks()
// اطبع getDetails() لكل كتاب
}
}جميع دروس البرمجة كائنية التوجه
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أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المكررتدرّب بنفسك: مترجم Java عبر الإنترنت