1 个不稳定版本
0.1.0 | 2020年12月7日 |
---|
#2235在数据结构
14KB
239 行
Rust包key_set
KeySet表示全集合、空集合、Some(list)和AllExceptSome(list)的概念,带有基本的集合计算(交集、差集、逆集)。
其他版本
- TypeScript: https://github.com/eturino/ts-key-set
- Ruby: https://github.com/eturino/ruby_key_set
用法
我们有一个枚举
KeySet::All
表示所有可能的键(𝕌
)KeySet::None
表示一个空集合(∅
)KeySet::Some(vec)
表示一个具体集合(A ⊂ 𝕌
)KeySet::AllExceptSome(vec)
表示集合的补集,除了给定的元素之外的所有元素(A' = {x ∈ 𝕌 | x ∉ A}
)_(见维基百科中的补集)*
我们可以有一个T
类型的KeySet,其中T: Ord + Debug + Clone
KeySet实现了cmp::Ord
、cmp::PartialOrd
、cmp::Eq
、cmp::PartialEq
、std::fmt::Debug
和std::fmt::Display
创建: KeySet::for_some(&list)
, KeySet::for_all_except_some(&list)
使用工厂函数构建您的KeySet,给出
- 要获取表示给定列表的KeySet:
KeySet::for_some(&list)
- 如果列表为空,我们将得到
None
- 否则,我们将得到
Some
- 如果列表为空,我们将得到
- 要获取表示给定列表的补集的KeySet:
KeySet::for_all_except_some(&list)
- 如果列表为空,我们将得到
All
- 否则,我们将得到
AllExceptSome
- 如果列表为空,我们将得到
fn example() {
let empty_vector: Vec<i32> = vec![];
let ks1 = KeySet::for_some(&empty_vector); // => KeySet::None
let ks2 = KeySet::for_some(&vec![1, 2, 3]); // => KeySet::Some([1, 2, 3])
let ks3 = KeySet::for_all_except_some(empty_vector); // => KeySet::All
let ks4 = KeySet::for_all_except_some(&vec![1, 2, 3]); // => KeySet::AllExceptSome([1, 2, 3])
}
包含(&元素)
返回一个布尔值,定义KeySet是否包含给定的元素。
fn example() {
let ks1 = KeySet::for_some(vec![1, 2, 3]); // => KeySet::Some([1, 2, 3])
ks1.contains(&1); // => true
ks1.contains(&7); // => false
let ks2: KeySet<i32> = KeySet::All;
ks2.contains(&1); // => true
ks2.contains(&7); // => true
let ks3: KeySet<i32> = KeySet::None;
ks3.contains(&1); // => false
ks3.contains(&7); // => false
let ks4 = KeySet::for_all_except_some(vec![1, 2, 3]); // => KeySet::AllExceptSome([1, 2, 3])
ks4.contains(&1); // => false
ks4.contains(&7); // => true
}
取反()
所有KeySet都有一个 invert()
方法,该方法返回相反类的实例,表示补集KeySet。(参见 维基百科上的补集)
All
⟷None
Some
⟷AllExceptSome
fn example() {
let key_set = KeySet::for_some(vec![1, 2, 3]); // => KeySet::Some([1, 2, 3])
let comp = key_set.clone(); // => KeySet::AllExceptSome([1, 2, 3])
}
移除(&其他)
返回一个新的KeySet,表示ThisSet - OtherSet的差 (A - B)
fn example() {
let key_set = KeySet::for_some(vec![1, 2, 3]); // => KeySet::Some([1, 2, 3])
let other = KeySet::for_some(vec![1, 3, 4]); // => KeySet::Some([1, 2, 3])
let comp = key_set.remove(&other); // => KeySet::Some([2])
}
交集(&其他)
返回一个新的KeySet,表示两个集合的交集 (A ∩ B)
,表示两个集合中存在的元素
fn example() {
let key_set = KeySet::for_some(vec![1, 2, 3]); // => KeySet::Some([1, 2, 3])
let other = KeySet::for_some(vec![1, 3, 4]); // => KeySet::Some([1, 2, 3])
let comp = key_set.intersect(&other); // => KeySet::Some([1, 3])
}
克隆()
所有KeySet都有一个 clone()
方法,该方法将返回一个表示相同KeySet的新实例。
如果KeySet是 KeySetSome
或 KeySetAllExceptSome
,它们将有一个包含相同键的向量。
fn example() {
let key_set = KeySet::for_some(vec![1, 2, 3]); // => KeySet::Some([1, 2, 3])
let comp = key_set.clone(); // => KeySet::Some([1, 2, 3])
let equal = key_set == comp; // => true
}
依赖项
~0.4–1MB
~22K SLoC