ممارسة: تطبيقات 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 الملفات أو قاعدة البيانات.
📖 ملخص
- Map للفهرسة حسب المعرف
- List لتخزين الدرجات
- Streams للترتيب والإحصائيات والتجميع
- Collectors.groupingBy للتجميع
📝 تمارين
- استيراد: استورد درجات من ملف CSV
- إحصائيات المواد: احسب المعدل والأعلى والأدنى لكل مادة
- بحث: ادعم البحث حسب اسم الطالب
الدرس التالي
في الدرس التالي، سنتعلم File IO — عمليات الملفات.



