การนับและการจัดกลุ่ม
รูปแบบทั่วไปที่อาศัยแมป
การนับและการจัดกลุ่ม เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- สร้าง HashMap
- Entry API และค่าเริ่มต้น
- ทำงานกับ HashSet
- การนับและการจัดกลุ่ม