'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
中的浮点数将 vec1
和 vec2
排序在一起,我可以将它们压缩到一个元组中并对元组的压缩向量进行排序:
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]
}
let (vec1_sorted, vec2_sorted): (Vec<bool>, Vec<f64>) = zipped.into_iter().unzip();
您 Iterator::unzip()
正是为此目的:
(vec1, vec2) = zipped.into_iter().unzip();
所以如果我有两个向量:
let mut vec1 = vec![true, false, false, true];
let mut vec2 = vec![1.0, 0.0, 4.0, 2.0];
并且我想根据 vec2
中的浮点数将 vec1
和 vec2
排序在一起,我可以将它们压缩到一个元组中并对元组的压缩向量进行排序:
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]
}
let (vec1_sorted, vec2_sorted): (Vec<bool>, Vec<f64>) = zipped.into_iter().unzip();
您 Iterator::unzip()
正是为此目的:
(vec1, vec2) = zipped.into_iter().unzip();