Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

خاصية البحث

جزء من قسم البرمجة كائنية التوجه في رحلة Java على Coddy. الدرس 80 من 87.

challenge icon

التحدي

سهل

لنُحسّن نظام إدارة المكتبة لديك بقدرات بحث قوية! لا تكون المكتبة مفيدة جدًا إذا لم يتمكن المستخدمون من العثور على الكتب التي يبحثون عنها. ستضيف طرقًا للبحث حسب العنوان والمؤلف، مما يجعل مكتبتك عملية حقًا.

ستواصل البناء على التعليمات البرمجية الموجودة لديك عبر أربعة ملفات:

  • 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() لكل كتاب
    }
}

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Java عبر الإنترنت