التكرار عبر Hash Map
جزء من قسم Logic & Flow في رحلة Rust على Coddy — الدرس 31 من 66.
في بعض الأحيان تحتاج إلى فحص كل زوج مفتاح-قيمة في خريطة التجزئة (hash map) الخاصة بك، بدلاً من البحث عن مفاتيح محددة. توفر لغة Rust طريقة بسيطة للتكرار عبر جميع البيانات باستخدام حلقة for:
for (key, value) in &my_map {
println!("{}: {}", key, value);
}لاحظ الـ & قبل my_map - هذا ينشئ مرجعاً لـ hash map بحيث يمكنك التكرار دون نقل الملكية. تمنحك الحلقة كل زوج مفتاح-قيمة كـ tuple يمكنك تفكيكه مباشرة في إعلان الحلقة.
إليك مثال عملي مع قائمة أسعار:
let mut prices = HashMap::new();
prices.insert("apple", 1.20);
prices.insert("banana", 0.80);
for (item, price) in &prices {
println!("{} costs ${:.2}", item, price);
}هناك تفصيل واحد مهم يجب تذكره: جداول التجزئة (hash maps) لا تضمن أي ترتيب محدد للتكرار. قد تظهر الأزواج بتسلسل مختلف في كل مرة تقوم فيها بتشغيل برنامجك. هذا لأن جداول التجزئة تعطي الأولوية لعمليات البحث السريعة على حساب الحفاظ على ترتيب الإدخال، لذا لا تعتمد على ظهور العناصر في أي تسلسل معين عند التكرار.
التحدي
سهلستتلقى عدداً صحيحاً n يشير إلى عدد أزواج (اسم الطالب - الدرجة) التي سيتم معالجتها. بعد ذلك، ستتلقى n من أزواج المدخلات: اسم الطالب متبوعاً بدرجة اختباره (كعدد صحيح). قم بإنشاء خريطة تجزئة (hash map) لتخزين أسماء الطلاب كمفاتيح ودرجاتهم كقيم. بعد إدراج جميع الأزواج، قم بالمرور على خريطة التجزئة واطبع اسم كل طالب ودرجته.
المتطلبات:
- استورد
HashMapمنstd::collections - أنشئ خريطة تجزئة قابلة للتعديل (mutable) بالأنواع
HashMap<String, i32> - اقرأ المدخل الأول وقم بتحويله إلى
i32للحصول على عدد الأزواج - استخدم حلقة تكرار (loop) لقراءة
nمن أزواج المدخلات (اسم الطالب، ثم الدرجة) - أدرج اسم كل طالب ودرجته في خريطة التجزئة
- استخدم حلقة
forللمرور على خريطة التجزئة باستخدام&map - اطبع معلومات كل طالب بالتنسيق التالي:
[name]: [score] - اطبع الأزواج بأي ترتيب (خرائط التجزئة لا تضمن الترتيب)
المدخلات:
- السطر الأول: عدد صحيح
n(مثلاً،3) - الـ
nأزواج التالية من الأسطر:- اسم الطالب (مثلاً،
Alice) - درجة الاختبار كعدد صحيح (مثلاً،
95)
- اسم الطالب (مثلاً،
المخرجات:
- سطر واحد لكل طالب بالتنسيق التالي:
[name]: [score] - قد يختلف ترتيب أسطر المخرجات بين عمليات التشغيل التجريبية
ورقة مرجعية
لتكرار جميع أزواج المفتاح والقيمة في خريطة تجزئة (hash map)، استخدم حلقة for مع مرجع للخريطة:
for (key, value) in &my_map {
println!("{}: {}", key, value);
}الرمز & قبل خريطة التجزئة ينشئ مرجعاً، مما يسمح بالتكرار دون نقل الملكية. تقوم الحلقة بتفكيك كل زوج مفتاح-قيمة كـ tuple.
مثال مع خريطة تجزئة:
let mut prices = HashMap::new();
prices.insert("apple", 1.20);
prices.insert("banana", 0.80);
for (item, price) in &prices {
println!("{} costs ${:.2}", item, price);
}هام: خرائط التجزئة لا تضمن أي ترتيب تكرار محدد. قد تظهر الأزواج بتسلسلات مختلفة في كل مرة تقوم فيها بتشغيل برنامجك، حيث تعطي خرائط التجزئة الأولوية لعمليات البحث السريعة على الحفاظ على ترتيب الإدخال.
جرّب بنفسك
use std::collections::HashMap;
use std::io::{self, BufRead};
fn main() {
let stdin = io::stdin();
let mut lines = stdin.lock().lines();
// قراءة عدد أزواج (اسم الطالب - الدرجة)
let n: i32 = lines.next().unwrap().unwrap().trim().parse().unwrap();
// إنشاء hash map قابلة للتعديل لتخزين أسماء الطلاب ودرجاتهم
let mut students: HashMap<String, i32> = HashMap::new();
// TODO: اكتب الكود الخاص بك أدناه
// اقرأ n من أزواج المدخلات (اسم الطالب والدرجة) وقم بإدراجها في الـ hash map
// TODO: قم بالمرور على الـ hash map واطبع اسم كل طالب ودرجته
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1تدفق التحكم المتقدم
تعبير 'match'مطابقة قيم متعددةمطابقة النطاقاتتعبير 'if let'الحلقات التكرارية كتعبيراتمراجعة - محلل أوامر بسيط4تجميع البيانات باستخدام Structs
ما هو الـ Struct؟نظرة عامة على الـ Structsالوصول إلى حقول الـ Structالـ Structs القابلة للتعديلالـ Structs كمعاملات للدوالالـ Tuple Structsمراجعة - إنشاء Book Struct7معالجة الأخطاء باستخدام 'Result'
ما هو 'Result'؟استخدام 'match' مع 'Result'is_ok() و is_err()اختصارات: unwrap و expectعامل علامة الاستفهام '?'تحويل السلاسل النصية إلى أرقامملخص - دالة القسمة الآمنة10الـ Closures والدوال المجهولة
ما هو الـ Closure؟تعريف Closure بسيطالـ Closures مع المعاملاتالتقاط البيئة المحيطةملخص - Closure الجامع البسيط2مقدمة في الـ Vectors
ما هو الـ Vector؟إنشاء Vectorإضافة عناصر باستخدام pushالوصول إلى عناصر الـ Vectorالتكرار عبر الـ Vectorالتكرار القابل للتعديل (Mutable Iteration)إزالة العناصرمراجعة - متتبع نقاط بسيط5أزواج (المفتاح والقيمة) مع Hash Maps
ما هو Hash Map؟إنشاء Hash Mapإدراج أزواج (المفتاح والقيمة)الوصول إلى القيمالتكرار عبر Hash Mapتحديث قيمةإزالة زوجملخص - عداد الكلمات6التعامل مع غياب القيم باستخدام 'Option'
ما هو الـ 'Option'؟استخدام 'match' مع 'Option''is_some()' و 'is_none()'فك تغليف الـ 'Option'الدالة 'expect'توفير قيمة افتراضية: 'unwrap_or'مراجعة - البحث عن عنصر9شرائح الـ String والمزيد
String مقابل &strإنشاء شرائح الـ Stringالشرائح كمعاملات للدوالشرائح أخرىمراجعة - إيجاد الكلمة الأولى