3个版本
新 0.1.3 | 2024年8月27日 |
---|---|
0.1.2 | 2024年8月27日 |
0.1.1 | 2024年8月27日 |
0.1.0 |
|
#1119 in 数据结构
21KB
370 行
ScoredSortedSet
ScoredSortedSet
是一个在 Rust 中实现的线程安全、评分和排序的集合,允许您将项目与整数值的评分关联起来,根据评分检索项目,更新评分,并查询集合中的最高或最低评分。
特性
- 添加具有特定评分的项目。
- 基于评分和值移除项目。
- 更新现有项目的评分。
- 检索最高或最低评分及其相关项目。
- 查询前N个评分及其相关项目。
- 使用
RwLock
进行线程安全操作。
安装
要在项目中使用 ScoredSortedSet
,请将以下内容添加到您的 Cargo.toml
[dependencies]
scored_set = "0.1.0"
用法
示例1:添加和检索项目
use scored_set::ScoredSortedSet;
fn main() {
let set: ScoredSortedSet<String> = ScoredSortedSet::new();
set.add(10, "Alice".to_string());
set.add(20, "Bob".to_string());
// Retrieve items with score 10
let items = set.get(10).unwrap();
println!("{:?}", items); // Output: ["Alice"]
}
示例2:移除项目
use scored_set::ScoredSortedSet;
fn main() {
let set: ScoredSortedSet<String> = ScoredSortedSet::new();
set.add(15, "Charlie".to_string());
// Remove the item
let removed = set.remove(15, &"Charlie".to_string());
println!("{}", removed); // Output: true
// Try to retrieve the removed item
let items = set.get(15);
assert!(items.is_none());
}
示例3:更新项目的评分
use scored_set::ScoredSortedSet;
fn main() {
let set = ScoredSortedSet::new();
set.add(10, "Alice".to_string());
// Update Alice's score from 10 to 20
set.update_score(10, 20, &"Alice".to_string());
assert!(set.get(10).is_none());
let items = set.get(20).unwrap();
println!("{:?}", items); // Output: ["Alice"]
}
示例4:检索最高评分
use scored_set::ScoredSortedSet;
fn main() {
let set = ScoredSortedSet::new();
set.add(10, "Alice".to_string());
set.add(30, "Charlie".to_string());
set.add(20, "Bob".to_string());
// Get the highest score
let highest = set.highest_score().unwrap();
println!("{:?}", highest); // Output: (30, ["Charlie"])
}
示例5:检索所有评分
use scored_set::ScoredSortedSet;
fn main() {
let set = ScoredSortedSet::new();
set.add(10, "Alice".to_string());
set.add(30, "Charlie".to_string());
set.add(20, "Bob".to_string());
// Get all scores in ascending order
let scores = set.all_scores();
println!("{:?}", scores); // Output: [10, 20, 30]
}
示例6:多线程环境
use std::sync::{Arc, Barrier};
use std::thread;
use scored_set::ScoredSortedSet;
fn main() {
// Wrap the ScoredSortedSet in an Arc to share it across threads
let set = Arc::new(ScoredSortedSet::new());
let barrier = Arc::new(Barrier::new(3)); // Barrier to synchronize thread completion
// Cloning the Arc for each thread
let set1 = Arc::clone(&set);
let barrier1 = Arc::clone(&barrier);
let handle1 = thread::spawn(move || {
set1.add(10, "Alice".to_string());
barrier1.wait(); // Wait for other threads
});
let set2 = Arc::clone(&set);
let barrier2 = Arc::clone(&barrier);
let handle2 = thread::spawn(move || {
set2.add(20, "Bob".to_string());
barrier2.wait(); // Wait for other threads
});
let set3 = Arc::clone(&set);
let barrier3 = Arc::clone(&barrier);
let handle3 = thread::spawn(move || {
set3.update_score(10, 30, &"Alice".to_string());
barrier3.wait(); // Wait for other threads
});
// Wait for all threads to finish
handle1.join().unwrap();
handle2.join().unwrap();
handle3.join().unwrap();
// Access the set after all threads have completed their operations
let highest = set.highest_score().unwrap();
println!("Highest score: {:?}", highest); // Output: (30, ["Alice"])
}