HashMap متداخل
جزء من قسم Logic & Flow في رحلة C# على Coddy — الدرس 53 من 66.
إن الـ HashMap المتداخل هو عبارة عن HashMap تكون فيه القيم نفسها عبارة عن HashMaps. وهذا مفيد لتنظيم البيانات الهرمية.
قم بإنشاء HashMap متداخلة لتخزين درجات الطلاب حسب المادة:
// إنشاء الـ HashMap الخارجية (الطالب -> المواد)
Dictionary<string, Dictionary<string, int>> studentGrades = new Dictionary<string, Dictionary<string, int>>();
// إنشاء HashMap داخلية لطالب (المادة -> الدرجة)
Dictionary<string, int> alexGrades = new Dictionary<string, int>();
// إضافة الدرجات إلى الـ HashMap الداخلية
alexGrades.Add("Math", 90);
alexGrades.Add("Science", 85);
// إضافة الـ HashMap الداخلية إلى الـ HashMap الخارجية
studentGrades.Add("Alex", alexGrades);الوصول إلى قيمة متداخلة:
// الوصول إلى درجة الرياضيات لـ Alex
int mathGrade = studentGrades["Alex"]["Math"]; // يعيد 90أضف طالباً آخر مع درجاته:
// إنشاء HashMap داخلي آخر
Dictionary<string, int> sarahGrades = new Dictionary<string, int>();
sarahGrades.Add("Math", 95);
sarahGrades.Add("Science", 92);
// الإضافة إلى HashMap الخارجي
studentGrades.Add("Sarah", sarahGrades);التحدي
متوسطأنشئ دالة باسم AddCourseGrade تأخذ أربعة وسائط:
- قاموس متداخل (nested Dictionary) يمثل درجات الطلاب:
Dictionary<string, Dictionary<string, int>> grades - اسم طالب (string)
- اسم دورة (string)
- درجة (int)
يجب أن تقوم الدالة بـ:
- إذا لم يكن الطالب موجوداً في القاموس، فقم بإنشاء إدخال جديد له
- أضف الدورة والدرجة إلى سجل الطالب
- إذا كانت الدورة موجودة بالفعل لذلك الطالب، فقم بتحديث الدرجة
- اطبع "Added [course] grade for [student]: [grade]" بعد الإضافة/التحديث
ورقة مرجعية
الـ HashMap المتداخل هو عبارة عن HashMap تكون القيم فيه هي نفسها HashMaps، وهو مفيد لتنظيم البيانات الهرمية.
إنشاء HashMap متداخل:
Dictionary<string, Dictionary<string, int>> studentGrades = new Dictionary<string, Dictionary<string, int>>();
// إنشاء HashMap داخلي
Dictionary<string, int> alexGrades = new Dictionary<string, int>();
alexGrades.Add("Math", 90);
alexGrades.Add("Science", 85);
// الإضافة إلى الـ HashMap الخارجي
studentGrades.Add("Alex", alexGrades);الوصول إلى القيم المتداخلة:
int mathGrade = studentGrades["Alex"]["Math"]; // يعيد 90إضافة إدخال آخر:
Dictionary<string, int> sarahGrades = new Dictionary<string, int>();
sarahGrades.Add("Math", 95);
sarahGrades.Add("Science", 92);
studentGrades.Add("Sarah", sarahGrades);جرّب بنفسك
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
class Program
{
public static void AddCourseGrade(Dictionary<string, Dictionary<string, int>> grades, string student, string course, int grade)
{
// اكتب كودك هنا
}
// تجاهل الكود الرئيسي، فهو يقوم بتحويل string إلى HashMap
static void Main(string[] args)
{
// تحقق مما إذا كان السطر الأول قد يكون JSON
string firstLine = Console.ReadLine();
Dictionary<string, Dictionary<string, int>> studentGrades = new Dictionary<string, Dictionary<string, int>>();
string student;
string course;
int grade;
// مدخلات بتنسيق JSON
if (firstLine != null && firstLine.StartsWith("{") && firstLine.EndsWith("}"))
{
try
{
// تحليل درجات الطلاب الموجودة من JSON
string jsonContent = firstLine.Substring(1, firstLine.Length - 2);
string studentPattern = @"""([^""]+)""\s*:\s*\{([^\}]+)\}";
MatchCollection studentMatches = Regex.Matches(jsonContent, studentPattern);
foreach (Match studentMatch in studentMatches)
{
string studentName = studentMatch.Groups[1].Value;
string coursesJson = studentMatch.Groups[2].Value;
Dictionary<string, int> courseGrades = new Dictionary<string, int>();
string coursePattern = @"""([^""]+)""\s*:\s*(\d+)";
MatchCollection courseMatches = Regex.Matches(coursesJson, coursePattern);
foreach (Match courseMatch in courseMatches)
{
string courseName = courseMatch.Groups[1].Value;
int courseGrade = int.Parse(courseMatch.Groups[2].Value);
courseGrades.Add(courseName, courseGrade);
}
studentGrades.Add(studentName, courseGrades);
}
// Parse student, course, and grade for the operation
string studentInput = Console.ReadLine();
Match studentNameMatch = Regex.Match(studentInput, @"""([^""]+)""");
student = studentNameMatch.Success ? studentNameMatch.Groups[1].Value : studentInput;
string courseInput = Console.ReadLine();
Match courseNameMatch = Regex.Match(courseInput, @"""([^""]+)""");
course = courseNameMatch.Success ? courseNameMatch.Groups[1].Value : courseInput;
grade = int.Parse(Console.ReadLine());
}
catch (Exception ex)
{
Console.WriteLine($"Error parsing JSON input: {ex.Message}");
return;
}
}
else
{
try
{
// Traditional input
student = firstLine;
course = Console.ReadLine();
grade = int.Parse(Console.ReadLine());
// Create an example entry
Dictionary<string, int> johnGrades = new Dictionary<string, int>();
johnGrades.Add("Math", 88);
studentGrades.Add("John", johnGrades);
}
catch (Exception ex)
{
Console.WriteLine($"Error parsing traditional input: {ex.Message}");
return;
}
}
AddCourseGrade(studentGrades, student, course, grade);
}
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1المصفوفات متعددة الأبعاد
أساسيات المصفوفات ثنائية الأبعادتعريف وتهيئة المصفوفات ثنائية الأبعادالوصول إلى عناصر المصفوفة ثنائية الأبعادالحلقات المتداخلة مع المصفوفات ثنائية الأبعادالمصفوفات المتعرجة (Jagged Arrays)عمليات المصفوفات الشائعةمراجعة - المصفوفات متعددة الأبعاد4تقنيات التحكم في التدفق
الإرجاع المبكرشروط الحمايةجمل القفز (goto)Break و Continueتسطيح الشروط المتداخلة7المعاملات المنطقية المتقدمة
التقييم المختصرالمعاملات المنطقية الشرطيةأولوية المعاملاتمراجعة - المعاملات المتقدمة2اتخاذ القرارات المتقدم
الشروط المتعددةالمنطق البولياني المعقدمقارنة بين If و Switchجمل Switch المتداخلةمراجعة - القرارات المتقدمة5معالجة الاستثناءات
أساسيات Try-Catchأنواع الاستثناءاتكتل Catch المتعددةالتعامل مع الملفاتكتلة FinallyUsing مقابل Try-Finallyاستثناءات مخصصةمراجعة - معالجة الأخطاء8نظام تحليل البيانات
إعداد جمع البياناتمنطق إدخال البيانات11HashSet الجزء الأول
ما هو الـ HashSet؟إضافة عنصرحذف عنصرالتحقق من وجود عنصرالفراغ والحجمملخص - HashSet3تحسينات الحلقات التكرارية
أداء الحلقات التكراريةالتكرار عبر البيانات المعقدةأنواع الحلقات التكراريةإعادة هيكلة الحلقات التكراريةملخص - الحلقات المحسنة6التعامل مع الـ Null
أساسيات الـ Null Referenceأنواع القيم القابلة للـ Nullأنماط التحقق من الـ Nullالبرمجة الدفاعيةملخص - أمان الـ Null