0Pricing
Learn Rust Coding · บทเรียน

ทำงานกับ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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