'unzip' 元组的 Vec

'unzip' a Vec of tuples

所以如果我有两个向量:

let mut vec1 = vec![true, false, false, true];
let mut vec2 = vec![1.0, 0.0, 4.0, 2.0];

并且我想根据 vec2 中的浮点数将 vec1vec2 排序在一起,我可以将它们压缩到一个元组中并对元组的压缩向量进行排序:

let zipped = vec1.iter().zip(vec2.iter()).collect::<(bool, f64)>();
zipped.sort_by(|a, b| a.1.partial_cmp(&b.1).expect("Can't compare"));

然后我可以将值重新分配回向量

vec1 = zipped.iter().map(|z| z.0).collect();
vec2 = zipped.iter().map(|z| z.1).collect();

在 Rust 中是否有更惯用的方法来对两个平行向量进行排序?这看起来真的很冗长。

我可以将这两个项目放在一个结构中,但是排序值比我一直想与结构关联的更容易丢弃,我想创建一个包装器结构来包含排序value + original struct 不会让事情变得更简单。

Link to playpen,完整代码:

fn main() {
    let mut vec1: Vec<bool> = vec![true, false, false, true];
    let mut vec2: Vec<f64> = vec![1.0, 0.0, 4.0, 2.0];
    println!("vec1: {:?}", vec1); // => vec1: [true, false, false, true]
    println!("vec2: {:?}", vec2); // => vec2: [1.0, 0.0, 4.0, 2.0]
    
    let mut zipped = vec1
        .into_iter()
        .zip(vec2.into_iter())
        .collect::<Vec<(bool, f64)>>();
        
    zipped.sort_by(|a, b| a.1.partial_cmp(&b.1).expect("Can't compare"));

    let vec1_sorted: Vec<bool> = zipped.iter().map(|z| z.0).collect();
    let vec2_sorted: Vec<f64> = zipped.iter().map(|z| z.1).collect();
    println!("vec1_sorted: {:?}", vec1_sorted); // => vec1_sorted: [false, true, true, false]
    println!("vec2_sorted: {:?}", vec2_sorted); // =>  vec2_sorted: [0.0, 1.0, 2.0, 4.0]
}

Iterator::unzip:

let (vec1_sorted, vec2_sorted): (Vec<bool>, Vec<f64>) = zipped.into_iter().unzip();

Playground

Iterator::unzip() 正是为此目的:

(vec1, vec2) = zipped.into_iter().unzip();

Playground.