Rust 程式設計中的 HashSet


Rust 也為我們提供了 HashSet 資料結構,當我們希望確保我們的資料結構中沒有重複的值時,主要會使用該結構。

如果我們嘗試將一個新值插入到一個 HashSet 中,而該值已經存在,那麼我們插入的舊值會被新值覆蓋

除了這些主要特性以外,HashSet 還用於執行以下操作 −

  • 並集 − 提取兩個集合中的所有唯一元素。
  • 差集 − 獲取第 1 個集合中但第 2 個集合中沒有的所有元素。
  • 交集 − 獲取兩個集合中都存在的的所有元素。
  • 對稱差 − 獲取在一個集合中或另一個集合中,但不在兩個集合中同時存在的所有元素。

例如

考慮如下所示的示例 −

use std::collections::HashSet;

fn main() {
   let mut a: HashSet = vec![1i32, 2, 3].into_iter().collect();
   let mut b: HashSet = vec![2i32, 3, 4].into_iter().collect();
   assert!(a.insert(4));
   assert!(a.contains(&4));
   // `HashSet::insert()` returns false if value already present  
   assert!(b.insert(4), "Value 4 is already in set B!");
   b.insert(5);
}

在這個示例中,我們建立了一個 HashSet,並向其中插入了值。如果嘗試插入已存在的值,則 insert() 函式將返回一個 false。因此,上面的程式碼將返回一個錯誤。

輸出

thread 'main' panicked at 'Value 4 is already in set B!',
src/main.rs:11:5
note: run with `RUST_BACKTRACE=1` environment variable to display
a backtrace

例如

現在,讓我們嘗試使用 HashSet 中提供的所有方法。考慮以下示例 −

use std::collections::HashSet;
fn main() {
   let mut a: HashSet = vec![1i32, 2, 3].into_iter().collect();
   let mut b: HashSet = vec![2i32, 3, 4].into_iter().collect();
   assert!(a.insert(4));
   assert!(a.contains(&4));
   b.insert(6);
   println!("A: {:?}", a);
   println!("B: {:?}", b);
   println!("Union: {:?}", a.union(&b).collect::>());
   println!("Difference: {:?}",
   a.difference(&b).collect::>());
   println!("Intersection: {:?}",
   a.intersection(&b).collect::>());
   println!("Symmetric Difference: {:?}",
   a.symmetric_difference(&b).collect::>());
}

輸出

A: {1, 2, 3, 4}
B: {4, 6, 2, 3}
Union: [1, 2, 3, 4, 6]
Difference: [1]
Intersection: [2, 3, 4]
Symmetric Difference: [1, 6]

最後更新日期: 03-4 月-2021

405 次瀏覽

啟動你的 事業

完成課程獲得認證

開始
廣告
© . All rights reserved.