Синхронизация данных между взаимосвязанными векторами

Как правильно организовать синхронизацию данных между
четырьмя логически взаимосвязанными векторами,
после сортировки первого?
Например, исходно имею:

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 шт):

Автор решения: extrn

С помощью крейта 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:?}");
}

play

Можно обойтись и стандартными средствами через промежуточный вектор (хотя 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();

play

В обоих случаях, если размеры векторов разные, они урежутся до минимального.

Но если хранение полей в разных векторах это не обязательное условие, а просто ваше видение того, как оно будет лучше, то наверное стоило бы изначально хранить данные в виде структур или кортежей.

#[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);

play

→ Ссылка