问题描述
我需要计算Vec中自定义结构的重复项。我找到了count partial duplicates in Vec of structs with a custom function。
我的代码是:
pub fn check_index_duplicates(
dataset: &[main_index::MotiveImageDeFinition],) -> Result<(),Box<dyn std::error::Error>> {
let mut keyed = HashMap::new();
for c in dataset {
keyed.entry(c.key()).or_insert(vec![]).push(c)
}
for (k,v) in &keyed {
if v.len() > 1 {
print_an_error(&(format!("Motive {:?} has {} duplicates on index.csv",k,v.len())));
}
}
Ok(())
}
impl main_index::MotiveImageDeFinition {
fn key<'a>(&'a self) -> (&'a str,&'a str) {
(&self.motive,&self.theme)
}
}
#[derive(Debug)]
pub struct MotiveImageDeFinition {
pub id: u64,pub motive: String,pub theme: String,pub path: String,pub stereo_image: String,pub width_pix: String,pub height_pix: String,}
这正是我所需要的。当我使用clippy时:
cargo clippy --all-targets --all-features -- -D warnings
它为我提供了以下两个无法修复的提示:
error: use of `or_insert` followed by a function call
--> src/image/mod.rs:215:30
|
215 | keyed.entry(c.key()).or_insert(vec![]).push(c)
| ^^^^^^^^^^^^^^^^^ help: try this: `or_insert_with(vec![])`
我尝试将or_insert
更改为or_insert_with
,但无法编译。
解决方法
对我实际起作用的是@ user4815162342答案:
pub fn check_index_duplicates(
dataset: &[main_index::MotiveImageDefinition],) -> Result<(),Box<dyn std::error::Error>> {
let mut keyed = HashMap::new();
for c in dataset {
keyed.entry(c.key()).or_insert_with(Vec::new).push(c)
}
for (k,v) in &keyed {
if v.len() > 1 {
print_an_error(&(format!("Motive {:?} has {} duplicates on index.csv",k,v.len())));
}
}
Ok(())
}