首页 > 解决方案 > 如何比较 HashMap 中向量的键?

问题描述

我有一个场景,我必须比较向量的键。我在每个向量键中有 2 个值。

我必须找到一个向量键,其中

  1. 向量的第一个值应该大于每个向量键的所有第一个值
  2. 并且向量的第二个值应该小于每个向量键的所有第二个值

请在下面找到示例代码:

let mut queue : HashMap<Vec<u8>, Vec<u8>> = HashMap::new();

queue.insert(vec![5 as u8, queue.keys().len() as u8], vec![0]);
queue.insert(vec![10 as u8, queue.keys().len() as u8], vec![1]);
queue.insert(vec![10 as u8, queue.keys().len() as u8], vec![2]);
queue.insert(vec![3 as u8, queue.keys().len() as u8], vec![2]);
queue.insert(vec![4 as u8, queue.keys().len() as u8], vec![3]);
queue.insert(vec![6 as u8, queue.keys().len() as u8], vec![4]);

let key= queue
    .iter()
    .max_by(|a, b| {
        a.0.cmp(&b.0)
    })
    .map(|(k, _v)| k);

println!("{:?}", key);

我得到这个输出Some([10, 2])。但我想Some([10, 1])作为输出。`

这是我的地图:{[10, 1]: [1], [4, 4]: [3], [6, 5]: [4], [10, 2]: [2], [3, 3]: [2], [5, 0]: [0]}

标签: rust

解决方案


您需要一个max_by比较函数,它比较第一个元素以找到最大的元素,第二个元素以找到最小的元素。让我们先处理第一个标准:第一个元素应该是最大的。

a.0[0].cmp(&b.0[0])

a.0并且b.0,正如您可能已经猜到的那样,从提供的键值对中选择键。然后我们使用普通[]的索引来获取向量的第一个元素。

现在,出于这个问题的目的,我假设我们想要字典顺序,也称为字典顺序。也就是说,您已经列出了两个标准,我假设第一个是先例,因此例如[10, 2]应该有利于[9, 1],因为第一个元素更大,尽管第二个元素并不小。

考虑到这个假设,我们可以扩大我们的比较。要反转排序(即选择最小而不是最大元素),我们可以简单地切换参数的顺序。

b.0[1].cmp(&a.0[1])

然后我们只想在第一个失败的情况下使用这个比较,即如果第一个相等。

match a.0[0].cmp(&b.0[0]) {
  Ordering::Equal => b.0[1].cmp(&a.0[1]),
  x => x
}

如果我们将它放入您的max_by函数中,我们会[10, 1]根据需要得到 。

但我们实际上可以做得更好。看,字典顺序是相当普遍的,如此普遍以至于它内置在 Rust 中。我们可以使用Ordering::then如下方法。

a.0[0].cmp(&b.0[0]).then(b.0[1].cmp(&a.0[1]))

这与前面的示例相同。

完整示例:

let mut queue : HashMap<Vec<u8>, Vec<u8>> = HashMap::new();

queue.insert(vec![5 as u8, queue.keys().len() as u8], vec![0]);
queue.insert(vec![10 as u8, queue.keys().len() as u8], vec![1]);
queue.insert(vec![10 as u8, queue.keys().len() as u8], vec![2]);
queue.insert(vec![3 as u8, queue.keys().len() as u8], vec![2]);
queue.insert(vec![4 as u8, queue.keys().len() as u8], vec![3]);
queue.insert(vec![6 as u8, queue.keys().len() as u8], vec![4]);

let key = queue
  .iter()
  .max_by(|a, b| {
    a.0[0].cmp(&b.0[0]).then(b.0[1].cmp(&a.0[1]))
  })
  .map(|(k, _v)| k);

println!("{:?}", key);

推荐阅读