【发布时间】:2021-06-05 22:36:32
【问题描述】:
假设我们有两个std::collections::HashMap-s,比如HashMap<K, V1>和HashMap<K, V2>,还有一个函数Fn(V1, V2) -> R。
如何对这些哈希映射执行内部联接,以便在它们的共享密钥上获得HashMap<K, R>?这是一个reference implementation 来说明我的意思:
use std::collections::HashMap;
fn main() {
let mut map_a = HashMap::<&str, i32>::new();
map_a.insert("foo", 1);
map_a.insert("bar", 2);
map_a.insert("qux", 3);
map_a.insert("quux", 4);
let mut map_b = HashMap::<&str, i32>::new();
map_b.insert("foo", 5);
map_b.insert("bar", 6);
map_b.insert("quuux", 7);
map_b.insert("quuuux", 8);
// To keep it simple I'm just combining respective values into a tuple:
let joined_map = map_a
.into_iter()
.filter_map(|(key, value_a)| map_b.remove(key).map(|value_b| (key, (value_a, value_b))))
.collect::<HashMap<&str, (i32, i32)>>();
println!("{:?}", joined_map);
}
预期的输出是:
{"foo": (1, 5), "bar": (2, 6)}
这很好用,我可以在utils.rs 中使其通用,但我在标准库或crates.io 上找不到它的现有实现感觉不太对劲。此外,不执行sort-merge join 似乎不是最理想的,因为我们已经在HashMap 下对哈希码进行了排序。我在监督什么吗?或者只是太挑剔了,因为无论如何查找都是O(1)?
【问题讨论】:
-
HashMap 是无序的,因此要进行排序合并,您必须先对两者进行排序。
标签: join rust hashmap inner-join