You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 14:31:02