التكرار عبر Hash Map
جزء من قسم المنطق وتدفّق التنفيذ في رحلة Rust على Coddy. الدرس 31 من 66.
أحيانًا تحتاج إلى فحص كل زوج من أزواج المفتاح والقيمة في خريطة التجزئة الخاصة بك، بدلًا من البحث عن مفاتيح محددة. توفر Rust طريقة بسيطة للتكرار عبر جميع البيانات باستخدام حلقة for:
for (key, value) in &my_map {
println!("{}: {}", key, value);
}لاحظ وجود & قبل my_map — فهذا ينشئ مرجعًا إلى خريطة التجزئة، بحيث يمكنك التكرار دون نقل الملكية. تمنحك الحلقة كل زوج من المفتاح والقيمة على هيئة صف، ويمكنك تفكيكه مباشرةً في تعريف الحلقة.
إليك مثالًا عمليًا باستخدام قائمة أسعار:
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 لا تضمن أي ترتيب محدد للتكرار. قد تظهر أزواج البيانات بتسلسل مختلف في كل مرة تشغّل فيها برنامجك. يعود ذلك إلى أن hash maps تعطي الأولوية لعمليات البحث السريعة على الحفاظ على ترتيب الإدراج، لذا لا تعتمد على ظهور العناصر بتسلسل معين عند إجراء التكرار.
التحدي
سهلستتلقى عددًا صحيحًا n يشير إلى عدد أزواج student-score المطلوب معالجتها. ثم ستتلقى n أزواج من inputs: اسم student متبوعًا بدرجة الاختبار الخاصة به (كعدد صحيح). أنشئ hash map لتخزين أسماء students كمفاتيح ودرجاتهم كقيم. بعد إدراج جميع الأزواج، نفّذ Iterate على hash map واطبع اسم كل student ودرجته.
المتطلبات:
- استورد
HashMapمنstd::collections - أنشئ hash map mutable بالأنواع
HashMap<String, i32> - اقرأ input الأول وحوّله إلى
i32للحصول على عدد الأزواج - استخدم حلقة لقراءة
nأزواج من inputs (اسم student، ثم الدرجة) - أدرج اسم كل student ودرجته في hash map
- استخدم حلقة
forلتنفيذ Iterate على hash map باستخدام&map - اطبع معلومات كل student بالتنسيق:
[name]: [score] - اطبع الأزواج بأي ترتيب (لا تضمن hash maps ترتيبًا)
Input:
- السطر الأول: عدد صحيح
n(مثلًا:3) - الأزواج التالية وعددها
nمن الأسطر:- اسم student (مثلًا:
Alice) - درجة الاختبار كعدد صحيح (مثلًا:
95)
- اسم student (مثلًا:
Output:
- سطر واحد لكل student بالتنسيق:
[name]: [score] - قد يختلف ترتيب أسطر Output بين عمليات تشغيل الاختبار
جرّب بنفسك
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();
// أنشئ خريطة تجزئة قابلة للتغيير لتخزين أسماء الطلاب والدرجات
let mut students: HashMap<String, i32> = HashMap::new();
// TODO: اكتب الكود الخاص بك أدناه
// اقرأ n زوجًا من المدخلات (اسم الطالب والدرجة) وأدرجها في خريطة التجزئة
// TODO: كرر على خريطة التجزئة واطبع اسم ودرجة كل طالب
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفّق التنفيذ
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الشرائح كمعاملات للدوالشرائح أخرىمراجعة - إيجاد الكلمة الأولىتدرّب بنفسك: مترجم Rust عبر الإنترنت