Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

التكرار عبر 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) لا تضمن أي ترتيب محدد للتكرار. قد تظهر الأزواج بتسلسل مختلف في كل مرة تقوم فيها بتشغيل برنامجك. هذا لأن جداول التجزئة تعطي الأولوية لعمليات البحث السريعة على حساب الحفاظ على ترتيب الإدخال، لذا لا تعتمد على ظهور العناصر في أي تسلسل معين عند التكرار.

challenge icon

التحدي

سهل

ستتلقى عدداً صحيحاً 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 واطبع اسم كل طالب ودرجته
    
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Logic & Flow