تحديث قيمة
جزء من قسم Logic & Flow في رحلة Rust على Coddy — الدرس 32 من 66.
أحيانًا تحتاج إلى تحديث القيم في خريطة التجزئة (hash map) بطرق مختلفة. لقد تعلمت بالفعل أن .insert() ستقوم بالكتابة فوق قيمة موجودة، ولكن ماذا لو كنت تريد فقط إضافة قيمة عندما لا يكون المفتاح موجودًا بالفعل؟
توفر Rust واجهة برمجة التطبيقات .entry() لتحديثات قيم أكثر تطوراً. الطريقة الأكثر فائدة في هذه الواجهة هي .or_insert()، والتي تقوم فقط بإدراج قيمة إذا لم يكن المفتاح موجوداً بالفعل:
let mut scores = HashMap::new();
scores.insert("Alice", 85);
// هذا لن يقوم بتغيير درجة Alice
scores.entry("Alice").or_insert(90);
// هذا سيضيف درجة Bob لأنه ليس موجوداً في الخريطة
scores.entry("Bob").or_insert(90);تُرجع طريقة .entry() تعداد Entry الذي يمثل إما مكاناً مشغولاً أو شاغراً في خريطة التجزئة (hash map). عندما تستدعي .or_insert() عليها، فإنها تقوم فقط بإدراج القيمة الجديدة إذا كان الإدخال شاغراً (المفتاح غير موجود).
التحدي
سهلستتلقى عدداً صحيحاً n يشير إلى عدد أسماء اللاعبين المطلوب معالجتها. بعد ذلك، ستتلقى n من أسماء اللاعبين كمدخلات. قم بإنشاء خريطة تجزئة (hash map) لتتبع نتائج اللاعبين (من النوع HashMap<String, i32>). لكل اسم لاعب تتلقاه، استخدم .entry() مع .or_insert() لإضافتهم إلى الخريطة بنتيجة أولية قدرها 100 فقط إذا لم يكونوا موجودين بالفعل. بعد معالجة جميع الأسماء، قم بطباعة كل لاعب ونتيجته.
المتطلبات:
- استورد
HashMapمنstd::collections - أنشئ خريطة تجزئة قابلة للتعديل (mutable) بالأنواع
HashMap<String, i32> - اقرأ المدخل الأول وقم بتحويله إلى
i32للحصول على عدد أسماء اللاعبين - استخدم حلقة تكرار (loop) لقراءة
nمن أسماء اللاعبين - لكل اسم لاعب، استخدم
.entry(name).or_insert(100)لإضافتهم بنتيجة100إذا لم يكونوا موجودين بالفعل في الخريطة - بعد معالجة جميع الأسماء، قم بالتكرار عبر خريطة التجزئة واطبع معلومات كل لاعب بالتنسيق التالي:
[name]: [score]
المدخلات:
- السطر الأول: عدد صحيح
n(مثلاً،5) - الأسطر الـ
nالتالية: أسماء اللاعبين (مثلاً،Alice،Bob،Alice،Charlie،Bob)
المخرجات:
- سطر واحد لكل لاعب فريد بالتنسيق:
[name]: [score] - قد يختلف ترتيب أسطر المخرجات بين عمليات التشغيل التجريبية
ورقة مرجعية
توفر واجهة برمجة التطبيقات .entry() طرقاً متطورة لتحديث قيم خرائط التجزئة (hash map). تقوم طريقة .or_insert() بإدراج قيمة فقط إذا لم يكن المفتاح موجوداً بالفعل:
let mut scores = HashMap::new();
scores.insert("Alice", 85);
// لن يؤدي هذا إلى الكتابة فوق درجة Alice
scores.entry("Alice").or_insert(90);
// سيؤدي هذا إلى إضافة درجة Bob لأنه ليس في الخريطة
scores.entry("Bob").or_insert(90);تعيد طريقة .entry() تعداداً من نوع Entry يمثل إما مكاناً مشغولاً أو شاغراً في خريطة التجزئة. عند استدعاء .or_insert()، فإنها تقوم فقط بإدراج القيمة الجديدة إذا كان الإدخال شاغراً (المفتاح غير موجود).
جرّب بنفسك
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();
// إنشاء HashMap قابل للتعديل لتخزين نتائج اللاعبين
let mut player_scores: HashMap<String, i32> = HashMap::new();
// TODO: اكتب الكود الخاص بك أدناه
// اقرأ n من أسماء اللاعبين واستخدم .entry().or_insert(100) لإضافتهم إلى الخريطة
// اطبع كل لاعب ونتيجته بالتنسيق التالي: [name]: [score]
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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الشرائح كمعاملات للدوالشرائح أخرىمراجعة - إيجاد الكلمة الأولى