如何对Rust中关联的两个Vec数组进行升序同步排序?
同步排序两个关联的Vec数组
你可以通过两种常见方式实现需求:将元素配对排序后拆分,或是基于索引间接排序。
方法一:配对元组排序(推荐,直观简洁)
把两个数组的对应元素打包成元组,排序后再拆分回原数组,完整代码如下:
fn main() { let mut ratings = vec![2000.0, 2012.0, 2390.0, 1234.0]; let mut ids = vec![1, 2, 3, 4]; // 打包成(评分, ID)的元组数组 let mut paired: Vec<_> = ratings.into_iter().zip(ids.into_iter()).collect(); // 按元组第一个元素(评分)升序排序 paired.sort_by(|a, b| a.0.partial_cmp(&b.0).unwrap()); // 拆分回两个独立数组 let (sorted_ratings, sorted_ids): (Vec<_>, Vec<_>) = paired.into_iter().unzip(); // 验证结果 assert!(sorted_ratings == vec![1234.0, 2000.0, 2012.0, 2390.0]); assert!(sorted_ids == vec![4, 1, 2, 3]); }
- 核心逻辑:
zip方法保留了评分与ID的关联关系,元组排序默认优先比较第一个元素,正好匹配按评分排序的需求。 - 注意:浮点数需用
partial_cmp而非cmp,因为浮点数存在NaN的特殊情况,这里可以用unwrap是因为示例中无无效值。
方法二:基于索引排序(适合不想移动原数组元素的场景)
通过对索引数组排序,再根据排序后的索引重构目标数组:
fn main() { let mut ratings = vec![2000.0, 2012.0, 2390.0, 1234.0]; let mut ids = vec![1, 2, 3, 4]; // 创建索引数组并按对应评分排序 let mut indices: Vec<_> = (0..ratings.len()).collect(); indices.sort_by(|&i, &j| ratings[i].partial_cmp(&ratings[j]).unwrap()); // 根据排序后的索引生成新数组 let sorted_ratings: Vec<_> = indices.iter().map(|&i| ratings[i]).collect(); let sorted_ids: Vec<_> = indices.iter().map(|&i| ids[i]).collect(); // 验证结果 assert!(sorted_ratings == vec![1234.0, 2000.0, 2012.0, 2390.0]); assert!(sorted_ids == vec![4, 1, 2, 3]); }
内容的提问来源于stack exchange,提问作者EGORLETOV
相关产品推荐
相关产品推荐

