ทำงานกับ HashSet
ติดตามค่าที่ไม่ซ้ำกัน
ทำงานกับ HashSet เป็นบทเรียน Learn Rust Coding ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Learn Rust Coding และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน
HashSet คืออะไร
HashSet จัดเก็บคอลเลกชันของค่าที่ไม่ซ้ำกัน ไม่มีค่าซ้ำและไม่มีคีย์ มีเพียงสมาชิกเท่านั้น
เหมาะอย่างยิ่งสำหรับตอบคำถามหนึ่งข้ออย่างรวดเร็วว่า "ฉันเคยเห็นค่านี้มาก่อนหรือไม่"
การสร้างเซต
เช่นเดียวกับ HashMap ตรงที่ HashSet อยู่ใน std::collections และต้องนำเข้าด้วย use
สร้างเซตว่างด้วย HashSet::new() และประกาศเป็น mut เพื่อเพิ่มรายการ
use std::collections::HashSet;
fn main() {
let mut s: HashSet<i32> = HashSet::new();
s.insert(1);
s.insert(2);
println!("size: {}", s.len());
}การแทรกและค่าซ้ำ
เมธอด insert คืนค่าเป็น bool: true หากค่าเป็นค่าใหม่ และ false หากมีค่านั้นอยู่แล้ว
การแทรกค่าซ้ำจะไม่ทำอะไร ดังนั้นเซตจึงคงความไม่ซ้ำกันโดยอัตโนมัติ
use std::collections::HashSet;
fn main() {
let mut s = HashSet::new();
println!("{}", s.insert(5));
println!("{}", s.insert(5));
println!("len = {}", s.len());
}การทดสอบการเป็นสมาชิก
ใช้ contains เพื่อตรวจสอบว่ามีค่าอยู่ในเซตหรือไม่ เมธอดนี้คืนค่าเป็น bool
นี่คือเหตุผลที่พบบ่อยที่สุดในการเลือกใช้เซต: ค้นหาได้รวดเร็วและชัดเจน
use std::collections::HashSet;
fn main() {
let mut s = HashSet::new();
s.insert("red");
s.insert("blue");
println!("has red? {}", s.contains("red"));
println!("has green? {}", s.contains("green"));
}การลบสมาชิก
เมธอด remove รับค่าแล้วคืนค่า true หากค่านั้นมีอยู่และถูกลบออก
การลบสิ่งที่ไม่มีอยู่จะคืนค่า false เท่านั้น
use std::collections::HashSet;
fn main() {
let mut s = HashSet::new();
s.insert(7);
println!("{}", s.remove(&7));
println!("{}", s.remove(&7));
}การสร้างจากตัววนซ้ำ
คุณสามารถรวบรวมค่าจากตัววนซ้ำใด ๆ ลงใน HashSet ได้โดยตรง
นี่เป็นวิธีรวดเร็วในการกำจัดค่าซ้ำ: ป้อนรายการที่มีค่าซ้ำ แล้วเซตจะเก็บแต่ละค่าไว้เพียงครั้งเดียว
use std::collections::HashSet;
fn main() {
let nums = [1, 2, 2, 3, 3, 3];
let unique: HashSet<i32> = nums.iter().copied().collect();
println!("distinct: {}", unique.len());
}การวนซ้ำผ่านเซต
วนซ้ำผ่านเซตด้วยลูป for เพื่อเข้าถึงสมาชิกแต่ละตัว
เช่นเดียวกับ HashMap ลำดับการวนซ้ำไม่ได้รับการรับประกัน และอาจแตกต่างกันในแต่ละครั้งที่เรียกใช้
use std::collections::HashSet;
fn main() {
let s: HashSet<i32> = [10, 20, 30].into_iter().collect();
let mut total = 0;
for v in &s {
total += v;
}
println!("sum = {}", total);
}ยูเนียน
เมธอด union ให้ค่าทุกค่าที่อยู่ในเซตใดเซตหนึ่ง
เมธอดนี้คืนค่าตัววนซ้ำ ดังนั้นให้รวบรวมค่าเป็นเซตใหม่ หรือวนซ้ำผ่านค่าดังกล่าว
use std::collections::HashSet;
fn main() {
let a: HashSet<i32> = [1, 2, 3].into_iter().collect();
let b: HashSet<i32> = [3, 4].into_iter().collect();
let u: HashSet<i32> = a.union(&b).copied().collect();
println!("union size: {}", u.len());
}อินเตอร์เซกชัน
เมธอด intersection ให้ค่าที่พบในเซตทั้งสอง
เหมาะอย่างยิ่งสำหรับค้นหาองค์ประกอบร่วม เช่น แท็กที่ใช้ร่วมกันหรือเพื่อนที่มีร่วมกัน
use std::collections::HashSet;
fn main() {
let a: HashSet<i32> = [1, 2, 3].into_iter().collect();
let b: HashSet<i32> = [2, 3, 4].into_iter().collect();
let common: Vec<i32> = a.intersection(&b).copied().collect();
println!("common count: {}", common.len());
}ผลต่าง
เมธอด difference ให้ค่าที่อยู่ในเซตแรกแต่ไม่อยู่ในเซตที่สอง
สลับลำดับเพื่อหาผลต่างในทิศทางตรงข้าม นอกจากนี้ยังมี symmetric_difference สำหรับรายการที่อยู่ในเซตใดเซตหนึ่งเท่านั้น
use std::collections::HashSet;
fn main() {
let a: HashSet<i32> = [1, 2, 3].into_iter().collect();
let b: HashSet<i32> = [2].into_iter().collect();
let only_a: Vec<i32> = a.difference(&b).copied().collect();
println!("only in a: {}", only_a.len());
}เซตย่อยและเซตไม่ทับซ้อน
ใช้ is_subset เพื่อตรวจสอบว่าสมาชิกทุกตัวของเซตหนึ่งอยู่ในอีกเซตหนึ่งหรือไม่
ใช้ is_disjoint เพื่อทดสอบว่าเซตสองเซตไม่มีค่าใดร่วมกันเลย ทั้งสองเมธอดคืนค่า bool ธรรมดา
use std::collections::HashSet;
fn main() {
let a: HashSet<i32> = [1, 2].into_iter().collect();
let b: HashSet<i32> = [1, 2, 3].into_iter().collect();
println!("a subset of b? {}", a.is_subset(&b));
}ตรวจสอบอย่างรวดเร็ว
คุณแทรกค่าเดียวกันลงใน HashSet สองครั้ง
สรุปทบทวน
HashSet เก็บค่าที่ไม่ซ้ำกัน และตรวจสอบด้วย contains ได้อย่างรวดเร็ว
คุณได้แทรก ลบ ลบค่าซ้ำด้วย collect และรวมเซตด้วย union intersection และ difference
คำถามที่พบบ่อย
บทเรียน “ทำงานกับ HashSet” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ทำงานกับ HashSet” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Learn Rust Coding ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ทำงานกับ HashSet”
ติดตามค่าที่ไม่ซ้ำกัน คุณปฏิบัติ Learn Rust Coding ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Learn Rust Coding หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Learn Rust Coding บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “ทำงานกับ HashSet” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Learn Rust Coding นี้ได้ไหม
ได้ บทเรียน Learn Rust Coding ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- สร้าง HashMap
- Entry API และค่าเริ่มต้น
- ทำงานกับ HashSet
- การนับและการจัดกลุ่ม