在Rust中检查两个HashMap是否具有相同的键集

问题描述 投票:1回答:1

假设我有两个HashMaps(或具有映射到其他内容的键的any映射结构),map1和map2,并且我想确保它们具有相同的键集。请注意,keys在地图中是相同的类型,但是valuesnot

我最初的尝试只是:

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 iterator equality
1个回答
1
投票

在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))
}

Playground

此代码对您的代码进行了三处改进:

  • 使用Iterator::all会大大缩短代码。
  • 使用Iterator::all比检查HashMap::contains_key的结果要好。
  • 这首先检查长度,因为这是一种便宜的测试,应该首先进行。
© www.soinside.com 2019 - 2024. All rights reserved.