Learn Rust Coding · บทเรียน

การนับและการจัดกลุ่ม

รูปแบบทั่วไปที่อาศัยแมป

บทเรียน 4 จาก 413 ขั้นตอน

การนับและการจัดกลุ่ม เป็นบทเรียน Learn Rust Coding ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Learn Rust Coding และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน

การนับสิ่งต่าง ๆ

งานที่พบได้บ่อยมากคือการนับว่าค่าแต่ละค่าปรากฏในคอลเลกชันกี่ครั้ง

HashMap ที่จับคู่ค่ากับจำนวนเป็นเครื่องมือที่เหมาะสมตามธรรมชาติ คีย์คือรายการ ส่วนค่าคือจำนวนที่นับได้

รูปแบบการนับ

สำหรับแต่ละรายการ ให้ค้นหาช่องของรายการนั้น กำหนดค่าเริ่มต้นเป็นศูนย์ แล้วเพิ่มขึ้นหนึ่ง

API ของ 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"]);
}

การค้นหาจำนวนสูงสุด

เมื่อมีจำนวนแล้ว ให้ค้นหารายการที่พบบ่อยที่สุดด้วยการวนซ้ำและติดตามค่าที่สูงที่สุด

คุณสามารถเปรียบเทียบจำนวนของแต่ละ entry กับค่าที่ดีที่สุดที่พบจนถึงขณะนั้น

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 ของสมาชิก API ของ 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

เริ่มต้นได้ฟรี

เรียนรู้ Rust ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
39
บทเรียน
144

คำถามที่พบบ่อย

บทเรียน “การนับและการจัดกลุ่ม” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การนับและการจัดกลุ่ม” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Learn Rust Coding ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การนับและการจัดกลุ่ม”

รูปแบบทั่วไปที่อาศัยแมป คุณปฏิบัติ Learn Rust Coding ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Learn Rust Coding หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Learn Rust Coding บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การนับและการจัดกลุ่ม” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Learn Rust Coding นี้ได้ไหม

ได้ บทเรียน Learn Rust Coding ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. สร้าง HashMap
  2. Entry API และค่าเริ่มต้น
  3. ทำงานกับ HashSet
  4. การนับและการจัดกลุ่ม
← กลับไปที่ Learn Rust Coding