Синхронизация данных между взаимосвязанными векторами
Как правильно организовать синхронизацию данных между
четырьмя логически взаимосвязанными векторами,
после сортировки первого?
Например, исходно имею:
let mut v01: Vec<&str> = vec!["111", "abc", "ghi", "222"];
let mut v02: Vec<&str> = vec!["One", "A", "G", "Two"];
let mut v03: Vec<&str> = vec!["i32", "&str", "&str", "i64"];
let mut v04: Vec<&str> = vec!["true", "false", "false", "true"];
после let _ = v01.sort();
...
хочу получить такой результат:
["111", "abc", "ghi", "222"]
...
результат:
["111", "222", "abc", "ghi"]
["One", "Two", "A", "G"]
["i32", "i64", "&str", "&str"]
["true", "true", "false", "false"]
Интересно для двух случаев:
(1) когда вектор v01 не имеет повторяющихся элементов;
(2) когда v01 имеет повторяющиеся элементы и, например, v04 для таких (повторяющихся) элементов имеет разные значения.
Ответы (1 шт):
С помощью крейта itertools можно сделать так
use itertools::Itertools;
fn main() {
let mut v01: Vec<&str> = vec!["111", "abc", "ghi", "222"];
let mut v02: Vec<&str> = vec!["One", "A", "G", "Two"];
let mut v03: Vec<&str> = vec!["i32", "&str", "&str", "i64"];
let mut v04: Vec<&str> = vec!["true", "false", "false", "true"];
(v01, v02, v03, v04) = itertools::multizip((v01, v02, v03, v04))
.sorted_by_key(|row| row.0)
.multiunzip();
println!("{v01:?}");
println!("{v02:?}");
println!("{v03:?}");
println!("{v04:?}");
}
Можно обойтись и стандартными средствами через промежуточный вектор (хотя itertools его тоже создает за кулисами)
let mut v: Vec<_> = v01.into_iter()
.zip(v02)
.zip(v03)
.zip(v04)
.collect();
v.sort_by_key(|x| x.0.0.0);
(((v01, v02), v03), v04) = v.into_iter().unzip();
В обоих случаях, если размеры векторов разные, они урежутся до минимального.
Но если хранение полей в разных векторах это не обязательное условие, а просто ваше видение того, как оно будет лучше, то наверное стоило бы изначально хранить данные в виде структур или кортежей.
#[derive(Debug)]
struct Data<'a> {
val1: &'a str,
val2: &'a str,
val3: &'a str,
val4: &'a str,
}
let mut v = vec![
Data { val1: "111", val2: "One", val3: "i32", val4: "true" },
Data { val1: "abc", val2: "A", val3: "&str", val4: "false" },
Data { val1: "ghi", val2: "G", val3: "&str", val4: "false" },
Data { val1: "222", val2: "Two", val3: "i64", val4: "true" },
];
v.sort_by_key(|data| data.val1);
dbg!(&v);