0Pricing
Learn Rust Coding · درس

العدّ والتجميع

تعرّف على الأنماط الشائعة القائمة على map

العدّ والتجميع درس مجاني في Learn Rust Coding على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Learn Rust Coding، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Learn Rust Coding 4 دروس في المجموع.

عدّ العناصر

من المهام الشائعة جدًا عدّ عدد مرات ظهور كل قيمة في مجموعة.

تُعد HashMap التي تربط القيمة بالعدد الأداة الطبيعية لذلك. فالمفتاح هو العنصر، والقيمة هي عدد مرات ظهوره.

نمط العد

لكل عنصر، ابحثوا عن خانته، واجعلوا قيمتها الافتراضية صفرًا، ثم أضيفوا واحدًا.

تجعل واجهة entry هذا الأمر سطرًا واحدًا واضحًا. ويعمل هذا النمط مع أي عنصر يمكن عده.

use std::collections::HashMap;

fn main() {
    let mut counts = HashMap::new();
    for n in [1, 1, 2, 3, 3, 3] {
        *counts.entry(n).or_insert(0) += 1;
    }
    println!("threes: {}", counts[&3]);
}

عدّ الأحرف

تتكون السلاسل النصية من أحرف، لذلك يمكنكم عد تكرار الأحرف بالطريقة نفسها.

استخدموا chars() للتكرار، ثم احسبوا عدد مرات ظهور كل حرف في الخريطة.

use std::collections::HashMap;

fn main() {
    let mut freq = HashMap::new();
    for c in "banana".chars() {
        *freq.entry(c).or_insert(0) += 1;
    }
    println!("a: {}, n: {}", freq[&'a'], freq[&'n']);
}

عدّ الكلمات

لعد الكلمات، قسّموا الجملة عند المسافات البيضاء باستخدام split_whitespace.

يصبح كل جزء مفتاحًا، وهذا هو الأساس لمحلل بسيط لتكرار الكلمات.

use std::collections::HashMap;

fn main() {
    let text = "go go stop go";
    let mut counts = HashMap::new();
    for w in text.split_whitespace() {
        *counts.entry(w).or_insert(0) += 1;
    }
    println!("go: {}", counts["go"]);
}

العثور على أكبر عدد

بعد الحصول على الأعداد، اعثروا على العنصر الأكثر تكرارًا بالتكرار على العناصر وتتبع أعلى قيمة.

يمكنكم مقارنة عدد كل عنصر بأفضل عدد عثرتم عليه حتى تلك اللحظة.

use std::collections::HashMap;

fn main() {
    let mut counts = HashMap::new();
    for c in "aabbbc".chars() {
        *counts.entry(c).or_insert(0) += 1;
    }
    let top = counts.iter().max_by_key(|(_, &v)| v).unwrap();
    println!("most common: {}", top.0);
}

تجميع العناصر

يضع التجميع العناصر في مجموعات تشترك في خاصية معينة.

استخدموا HashMap يربط مفتاح المجموعة بـ Vec من الأعضاء. وتستخدم واجهة entry متجهًا فارغًا كقيمة افتراضية عند أول استخدام.

use std::collections::HashMap;

fn main() {
    let mut groups: HashMap<bool, Vec<i32>> = HashMap::new();
    for n in 1..=6 {
        groups.entry(n % 2 == 0).or_default().push(n);
    }
    println!("evens: {:?}", groups[&true]);
}

التجميع حسب الحرف الأول

يُعد الحرف الأول من الكلمة مفتاحًا طبيعيًا للتجميع.

استخرجوه، ثم أضيفوا كل كلمة إلى المجموعة المطابقة.

use std::collections::HashMap;

fn main() {
    let words = ["apple", "avocado", "banana"];
    let mut by_letter: HashMap<char, Vec<&str>> = HashMap::new();
    for w in words {
        let first = w.chars().next().unwrap();
        by_letter.entry(first).or_default().push(w);
    }
    println!("a-words: {}", by_letter[&'a'].len());
}

التجميع حسب الطول

يمكنكم التجميع حسب أي خاصية محسوبة، مثل طول كل كلمة.

يكون المفتاح هنا رقمًا، وتجمع كل مجموعة الكلمات التي لها ذلك الطول.

use std::collections::HashMap;

fn main() {
    let words = ["hi", "yo", "hey", "hello"];
    let mut by_len: HashMap<usize, Vec<&str>> = HashMap::new();
    for w in words {
        by_len.entry(w.len()).or_default().push(w);
    }
    println!("len 2: {}", by_len[&2].len());
}

عدّ العناصر الفريدة

لعد القيم المختلفة، ادمجوا بين مجموعة وخريطة. أو اجمعوا القيم ببساطة في HashSet واقرؤوا طولها.

يخبركم ذلك بعدد العناصر المختلفة التي تظهر، مع تجاهل التكرارات.

use std::collections::HashSet;

fn main() {
    let visits = ["sam", "mia", "sam", "leo", "mia"];
    let unique: HashSet<&str> = visits.iter().copied().collect();
    println!("unique visitors: {}", unique.len());
}

عرض النتائج

بعد العد أو التجميع، كرروا على الخريطة لطباعة تقرير.

تذكروا أن الترتيب غير محدد؛ رتّبوا المفاتيح أولًا إذا احتجتم إلى مخرجات ثابتة.

use std::collections::HashMap;

fn main() {
    let mut counts = HashMap::new();
    for c in "abca".chars() {
        *counts.entry(c).or_insert(0) += 1;
    }
    let mut keys: Vec<_> = counts.keys().collect();
    keys.sort();
    for k in keys {
        println!("{}: {}", k, counts[k]);
    }
}

الجمع لكل مجموعة

بدلًا من جمع الأعضاء، يمكنكم تجميع قيمهم، مثل جمع القيم لكل مفتاح.

اجعلوا قيمة الخانة الافتراضية صفرًا، ثم أضيفوا قيمة كل عنصر، كما في العد ولكن باستخدام كميات فعلية.

use std::collections::HashMap;

fn main() {
    let sales = [("a", 10), ("b", 5), ("a", 3)];
    let mut totals: HashMap<&str, i32> = HashMap::new();
    for (k, amount) in sales {
        *totals.entry(k).or_insert(0) += amount;
    }
    println!("a total: {}", totals["a"]);
}

تحقق سريع

تريدون تجميع الكلمات في مجموعات حسب حرفها الأول.

مراجعة

عددتم العناصر والأحرف والكلمات باستخدام نمط entry، وعثرتم على القيمة الأكثر تكرارًا.

وجمعتم العناصر في مجموعات Vec حسب الحرف والطول، وعددتم القيم المختلفة باستخدام HashSet.

الأسئلة الشائعة

هل درس «العدّ والتجميع» مجاني؟

نعم — نص درس «العدّ والتجميع» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Learn Rust Coding، انتقل إلى CoddyKit PRO. تتضمن دورة Learn Rust Coding 4 دروس في المجموع.

ماذا ستتعلم في «العدّ والتجميع»؟

تعرّف على الأنماط الشائعة القائمة على map تتمرن على Learn Rust Coding مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Learn Rust Coding؟

لا تُشترط خبرة سابقة. Learn Rust Coding على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «العدّ والتجميع»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Learn Rust Coding هذا؟

نعم. كل درس في Learn Rust Coding يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. إنشاء HashMap
  2. واجهة Entry والقيم الافتراضية
  3. العمل مع HashSet
  4. العدّ والتجميع
← العودة إلى Learn Rust Coding