1 个不稳定版本
0.1.0 | 2024年7月25日 |
---|
#593 在 数据结构
每月下载量126
27KB
579 行
amalgamator
描述
amalgamator
是一种类似集合/映射的数据结构,允许您根据某些标准将集合/映射的成员组合在一起
当您想要合并不严格相等但相似到足以视为同一对象的元素时,此功能非常有用。
安装
cargo add amalgamator
序列化支持
如果您想使用 serde
支持功能,可以启用 serde
特性。
cargo add amalgamator --features serde
文档
查看docs.rs上的文档页面。
许可证
此项目采用MIT/Apache许可证,您可选择其中之一。
lib.rs
:
amalgamator
是一种类似集合/映射的数据结构,允许您根据某些标准将集合/映射的成员组合在一起。当您想要合并不严格相等但相似到足以视为同一对象的元素时,此功能非常有用。
这可以在多种情况下使用,例如
- 合并来自多个来源的数据
- 实体去重
- 数据标准化
Amalgamator是一种类似于集合/映射的数据结构,它使用用户定义的函数来决定哪些元素应该被合并,以及如何合并这些元素。这是通过Amalgamate
特性实现的。
首先,让我们看看如何实现 Amalgamate
特性
use amalgamator::Amalgamate;
use std::collections::HashSet;
struct Person {
name: String,
friends: HashSet<String>,
}
impl Amalgamate for Person {
type Key = String;
fn key(&self) -> Self::Key {
self.name.clone()
}
fn amalgamate(&mut self, other: Self) {
self.friends.extend(other.friends);
}
}
在这个例子中,我们有一个 Person
结构体,它有一个 Person
结构体和一个 Person
结构体。我们通过定义 Key
类型为 String
并实现 key
和 amalgamate
函数来为 Person
实现 Amalgamate
特性。我们假设 name
字段的值对于每个 Person
是唯一的,因此我们使用它作为键来确定是否应该合并两个 Person
对象。
现在我们已经实现了 Amalgamate
特性,我们可以使用 Amalgamator
数据结构来合并 Person
对象。更好的是,我们可以像使用常规的集合/映射数据结构一样使用它。
use amalgamator::Amalgamator;
#
#
#
let mut amalgamator = Amalgamator::new();
let alice = Person {
name: "Alice".to_string(),
friends: ["Bob", "Charlie"].iter().map(|s| s.to_string()).collect(),
};
let bob = Person {
name: "Bob".to_string(),
friends: ["Alice", "Charlie"].iter().map(|s| s.to_string()).collect(),
};
let other_alice = Person {
name: "Alice".to_string(),
friends: ["David", "Eve"].iter().map(|s| s.to_string()).collect(),
};
amalgamator.add(alice);
amalgamator.add(bob);
amalgamator.add(other_alice);
assert_eq!(amalgamator.len(), 2);
let alice = &amalgamator["Alice"];
assert_eq!(alice.friends.len(), 4);
在这个例子中,我们创建了一个 Amalgamator
并向其中添加了三个 Person
对象。然后我们验证 Amalgamator
中只包含两个 Person
对象,因为两个具有相同名字的 Alice
对象(即相同的名字)已经被合并。然后我们从 Amalgamator
中检索 Alice
对象并验证它包含来自两个 Alice
对象的所有朋友。
特性
serde
:使用 Serde 使Amalgamator
能够进行序列化和反序列化。
依赖项
~175KB