假设我有两个HashMaps(或具有映射到其他内容的键的any映射结构),map1和map2,并且我想确保它们具有相同的键集。请注意,keys在地图中是相同的类型,但是values是not。
我最初的尝试只是:
map1.keys().eq(map2.keys())
并且,尽管这在first的时间内起作用,但用于迭代器的eq函数(可以理解)似乎是按迭代器产生的顺序比较键,而不是通过检查是否存在a键在第二个迭代器中的任何位置。这与HashMap :: keys()产生一个迭代器的事实结合在一起,其中键的顺序是不确定的意味着即使集合(在集合论的意义上),相等函数也经常会失败。的键是相同的。
所以,我的下一个尝试是创建一个执行此操作的函数:
fn keys_match<T:std::cmp::Eq + std::hash::Hash,U,V>(map1:&HashMap<T,U>, map2:&HashMap<T,V>) -> bool {
// Make sure that map1.keys() ⊆ map2.keys()
for key in map1.keys() {
match map2.get(key) {
None => return false,
Some(_) => {}
}
}
// If map1.keys() ⊆ map2.keys() and their sizes equal, then the sets are equal
map1.len() == map2.len()
}
Rust初学者注意:实际上,我的第一次尝试是因为知道映射中的键是String类型,所以我的函数签名是:
fn keys_match<T,U>(map1:&HashMap<String,T>, map2:&HashMap<String,U>) -> bool
直到我意识到我甚至可以通过要求他们具有Eq和Hash特征来通用化common key type。
问题:在Rust中还有更简洁的方法吗?
在Rust中还有更简洁的方法吗?
fn keys_match<T: Eq + Hash, U, V>(
map1: &HashMap<T, U>,
map2: &HashMap<T, V>,
) -> bool {
map1.len() == map2.len() && map1.keys().all(|k| map2.contains_key(k))
}
此代码对您的代码进行了三处改进:
Iterator::all
会大大缩短代码。Iterator::all
比检查HashMap::contains_key
的结果要好。