ممارسة: تطبيقات Collections

هذا الدرس هو تطبيق عملي للمرحلة الرابعة، يجمع بين Map و List و Streams.

متطلبات المشروع

بناء نظام إدارة درجات يدعم:

نموذج البيانات

JAVA
import java.util.ArrayList;
import java.util.List;

public class Student {
    private String id;
    private String name;
    private List<Subject> subjects;
    
    public Student(String id, String name) {
        this.id = id;
        this.name = name;
        this.subjects = new ArrayList<>();
    }
    
    public String getId() { return id; }
    public String getName() { return name; }
    public List<Subject> getSubjects() { return subjects; }
    
    public void addSubject(String name, int score) {
        subjects.add(new Subject(name, score));
    }
    
    public double getAverage() {
        if (subjects.isEmpty()) return 0;
        return subjects.stream()
            .mapToInt(Subject::getScore)
            .average()
            .orElse(0);
    }
    
    public int getTotal() {
        return subjects.stream()
            .mapToInt(Subject::getScore)
            .sum();
    }
    
    @Override
    public String toString() {
        return name + " (ID:" + id + "، المعدل:" + String.format("%.1f", getAverage()) + ")";
    }
}

public class Subject {
    private String name;
    private int score;
    
    public Subject(String name, int score) {
        this.name = name;
        this.score = score;
    }
    
    public String getName() { return name; }
    public int getScore() { return score; }
    
    @Override
    public String toString() {
        return name + ":" + score;
    }
}

فئة المدير

JAVA
import java.util.*;
import java.util.stream.Collectors;

public class GradeManager {
    private Map<String, Student> students;
    
    public GradeManager() {
        this.students = new LinkedHashMap<>();
    }
    
    // إضافة طالب
    public void addStudent(Student student) {
        students.put(student.getId(), student);
        System.out.println("تمت إضافة الطالب: " + student.getName());
    }
    
    // إضافة درجة
    public void addScore(String studentId, String subject, int score) {
        Student student = students.get(studentId);
        if (student != null) {
            student.addSubject(subject, score);
            System.out.println(student.getName() + " " + subject + " " + score);
        } else {
            System.out.println("الطالب غير موجود: " + studentId);
        }
    }
    
    // إيجاد طالب
    public Student findStudent(String id) {
        return students.get(id);
    }
    
    // ترتيب حسب المعدل
    public List<Student> sortByAverage() {
        return students.values().stream()
            .sorted((a, b) -> Double.compare(b.getAverage(), a.getAverage()))
            .collect(Collectors.toList());
    }
    
    // ترتيب حسب المجموع
    public List<Student> sortByTotal() {
        return students.values().stream()
            .sorted((a, b) -> Integer.compare(b.getTotal(), a.getTotal()))
            .collect(Collectors.toList());
    }
    
    // حساب المعدل العام
    public double getAverageScore() {
        return students.values().stream()
            .mapToDouble(Student::getAverage)
            .average()
            .orElse(0);
    }
    
    // الحصول على الطالب الأول
    public Student getTopStudent() {
        return students.values().stream()
            .max(Comparator.comparingDouble(Student::getAverage))
            .orElse(null);
    }
    
    // الحصول على الطالب الأخير
    public Student getBottomStudent() {
        return students.values().stream()
            .min(Comparator.comparingDouble(Student::getAverage))
            .orElse(null);
    }
    
    // تجميع حسب الدرجة
    public Map<String, List<Student>> groupByGrade() {
        return students.values().stream()
            .collect(Collectors.groupingBy(student -> {
                double avg = student.getAverage();
                if (avg >= 90) return "ممتاز";
                if (avg >= 80) return "جيد جداً";
                if (avg >= 70) return "جيد";
                if (avg >= 60) return "مقبول";
                return "راسب";
            }));
    }
    
    // الحصول على جميع الطلاب
    public List<Student> getAllStudents() {
        return new ArrayList<>(students.values());
    }
}

البرنامج الرئيسي

JAVA
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class GradeSystem {
    private static GradeManager manager = new GradeManager();
    private static Scanner scanner = new Scanner(System.in);
    
    public static void main(String[] args) {
        // تهيئة البيانات
        initData();
        
        // الحلقة الرئيسية
        int choice;
        do {
            showMenu();
            choice = scanner.nextInt();
            scanner.nextLine();
            
            switch (choice) {
                case 1: listStudents(); break;
                case 2: addScore(); break;
                case 3: viewStudent(); break;
                case 4: showRanking(); break;
                case 5: showStatistics(); break;
                case 6: showGroups(); break;
                case 0: System.out.println("شكراً!"); break;
                default: System.out.println("خيار غير صالح");
            }
        } while (choice != 0);
        
        scanner.close();
    }
    
    private static void initData() {
        Student s1 = new Student("S001", "أحمد");
        s1.addSubject("Java", 95);
        s1.addSubject("Python", 88);
        s1.addSubject("قواعد البيانات", 92);
        
        Student s2 = new Student("S002", "محمد");
        s2.addSubject("Java", 85);
        s2.addSubject("Python", 90);
        s2.addSubject("قواعد البيانات", 78);
        
        Student s3 = new Student("S003", "علي");
        s3.addSubject("Java", 78);
        s3.addSubject("Python", 82);
        s3.addSubject("قواعد البيانات", 88);
        
        manager.addStudent(s1);
        manager.addStudent(s2);
        manager.addStudent(s3);
    }
    
    private static void showMenu() {
        System.out.println("\n=== نظام إدارة الدرجات ===");
        System.out.println("1. عرض جميع الطلاب");
        System.out.println("2. إضافة درجة");
        System.out.println("3. عرض تفاصيل الطالب");
        System.out.println("4. ترتيب الدرجات");
        System.out.println("5. إحصائيات");
        System.out.println("6. مجموعات الدرجات");
        System.out.println("0. خروج");
        System.out.print("أدخل اختيارك: ");
    }
    
    private static void listStudents() {
        System.out.println("\n--- قائمة الطلاب ---");
        for (Student s : manager.getAllStudents()) {
            System.out.println(s);
        }
    }
    
    private static void addScore() {
        System.out.print("أدخل معرف الطالب: ");
        String id = scanner.nextLine();
        System.out.print("أدخل المادة: ");
        String subject = scanner.nextLine();
        System.out.print("أدخل الدرجة: ");
        int score = scanner.nextInt();
        scanner.nextLine();
        
        manager.addScore(id, subject, score);
    }
    
    private static void viewStudent() {
        System.out.print("أدخل معرف الطالب: ");
        String id = scanner.nextLine();
        
        Student student = manager.findStudent(id);
        if (student != null) {
            System.out.println("\n--- درجات " + student.getName() + " ---");
            for (Subject s : student.getSubjects()) {
                System.out.println(s);
            }
            System.out.printf("المجموع: %d، المعدل: %.1f%n", 
                student.getTotal(), student.getAverage());
        } else {
            System.out.println("الطالب غير موجود");
        }
    }
    
    private static void showRanking() {
        System.out.println("\n--- ترتيب الدرجات ---");
        List<Student> ranking = manager.sortByAverage();
        for (int i = 0; i < ranking.size(); i++) {
            Student s = ranking.get(i);
            System.out.printf("%d. %s - المعدل: %.1f%n", 
                i + 1, s.getName(), s.getAverage());
        }
    }
    
    private static void showStatistics() {
        System.out.println("\n=== إحصائيات ===");
        System.out.printf("معدل الفصل: %.1f%n", manager.getAverageScore());
        
        Student top = manager.getTopStudent();
        if (top != null) {
            System.out.printf("الأعلى: %s - %.1f%n", top.getName(), top.getAverage());
        }
        
        Student bottom = manager.getBottomStudent();
        if (bottom != null) {
            System.out.printf("الأدنى: %s - %.1f%n", bottom.getName(), bottom.getAverage());
        }
    }
    
    private static void showGroups() {
        System.out.println("\n=== مجموعات الدرجات ===");
        Map<String, List<Student>> groups = manager.groupByGrade();
        
        groups.forEach((grade, students) -> {
            System.out.println("\n" + grade + " (" + students.size() + " طلاب):");
            students.forEach(s -> 
                System.out.println("  " + s.getName() + " - " + String.format("%.1f", s.getAverage())));
        });
    }
}

مثال الناتج

TEXT
=== نظام إدارة الدرجات ===
1. عرض جميع الطلاب
2. إضافة درجة
3. عرض تفاصيل الطالب
4. ترتيب الدرجات
5. إحصائيات
6. مجموعات الدرجات
0. خروج
أدخل اختيارك: 4

--- ترتيب الدرجات ---
1. أحمد - المعدل: 91.7
2. محمد - المعدل: 84.3
3. علي - المعدل: 82.7

المفاهيم المستخدمة

المفهوم التطبيق
Map تخزين الطلاب حسب المعرف
List تخزين الدرجات
Streams الترتيب والإحصائيات والتجميع
Comparator قواعد الترتيب المخصصة
Collectors.groupingBy التجميع حسب الدرجة

❓ أسئلة شائعة

س كيف ندعم عدة فصول؟
ج استخدم Map<String, GradeManager> لتخزين عدة فصول.
س كيف نحفظ البيانات؟
ج استخدم IO الملفات أو قاعدة البيانات.

📖 ملخص

📝 تمارين

  1. استيراد: استورد درجات من ملف CSV
  2. إحصائيات المواد: احسب المعدل والأعلى والأدنى لكل مادة
  3. بحث: ادعم البحث حسب اسم الطالب

الدرس التالي

في الدرس التالي، سنتعلم File IO — عمليات الملفات.

100%