June 2018 Update
This commit is contained in:
parent
ba8067c3b7
commit
22f33d4004
5278 changed files with 84726 additions and 14379 deletions
|
|
@ -1,26 +1,43 @@
|
|||
use std::collections::HashMap;
|
||||
use std::hash::Hash;
|
||||
|
||||
// If you know one of the tables is smaller, it is best to make it the second parameter.
|
||||
fn hash_join<A, B, K>(first: &[(K, A)], second: &[(K, B)]) -> Vec<(A, K, B)>
|
||||
where
|
||||
K: Hash + Eq + Copy,
|
||||
A: Copy,
|
||||
B: Copy,
|
||||
{
|
||||
let mut hash_map = HashMap::new();
|
||||
|
||||
// hash phase
|
||||
for &(key, val_a) in second {
|
||||
// collect all values by their keys, appending new ones to each existing entry
|
||||
hash_map.entry(key).or_insert_with(Vec::new).push(val_a);
|
||||
}
|
||||
|
||||
let mut result = Vec::new();
|
||||
// join phase
|
||||
for &(key, val_b) in first {
|
||||
if let Some(vals) = hash_map.get(&key) {
|
||||
let tuples = vals.iter().map(|&val_a| (val_b, key, val_a));
|
||||
result.extend(tuples);
|
||||
}
|
||||
}
|
||||
|
||||
result
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let table_a = vec![
|
||||
(27, "Jonah"), (18, "Alan"), (28, "Glory"),
|
||||
(18, "Popeye"), (28, "Alan")
|
||||
];
|
||||
let table_b = vec![
|
||||
let table1 = [("Jonah", 27), ("Alan", 18), ("Glory", 28), ("Popeye", 18), ("Alan", 28)];
|
||||
let table2 = [
|
||||
("Jonah", "Whales"), ("Jonah", "Spiders"), ("Alan", "Ghosts"),
|
||||
("Alan", "Zombies"), ("Glory", "Buffy")
|
||||
];
|
||||
// hash phase
|
||||
let mut h = HashMap::new();
|
||||
for (i, a) in table_a.iter().enumerate() {
|
||||
h.entry(a.1).or_insert_with(Vec::new).push(i);
|
||||
}
|
||||
// join phase
|
||||
for b in table_b {
|
||||
if let Some(vals) = h.get(b.0) {
|
||||
for &val in vals {
|
||||
let a = table_a.get(val).unwrap();
|
||||
println!("{:?} {:?}", a, b);
|
||||
}
|
||||
}
|
||||
let result = hash_join(&table1, &table2);
|
||||
println!("Age | Character Name | Nemesis");
|
||||
println!("----|----------------|--------");
|
||||
for (age, name, nemesis) in result {
|
||||
println!("{:<3} | {:^14} | {}", age, name, nemesis);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue