rust - 如何比较 HashMap 中向量的键?
问题描述
我有一个场景,我必须比较向量的键。我在每个向量键中有 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]}
解决方案
您需要一个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);
推荐阅读
- algorithm - 8 Queen Problem - Lua,为什么只输出 5 个 Queen?
- python - 无法使用 Pandas 获取标题列的索引
- php - 如何使用位置占位符在 SELECT PDO 查询后迭代 MySQL 表?
- python - PyCharm 打开时运行 python 文件
- batch-file - 我已将脚本添加到正文中。每当我在 CMD 中运行所述脚本时,它都会关闭窗口。为什么
- flutter - 有没有办法迭代未来
- 飘飘然
- javascript - 难道我们看不到内置的构造函数,因为它们是用不同的语言编写的吗?
- javascript - 在 pagination.js 中使用 POST 请求
- image - Flutter image_picker 不适用于flutter_plugin_android_lifecycle 问题
- kotlin - if 条件的函数式表达方式