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

Rust中按指定字符规则排序字符串向量的惯用方法是什么?

在Rust中按指定规则排序字符串向量的惯用方式

直接使用sort_by_key方法是最惯用的实现方式——它通过返回一个排序键元组,让Rust自动按照元组的优先级(先比较第一个元素,再比较第二个)完成排序,完美匹配你的需求:先按第二个字符分组,再按第一个字符的数值排序。

示例代码

fn main() {
    let mut vec = vec!["3r", "2n", "2s", "7r", "1s", "1s", "6r", "1s", "1n", "1n", "5n", "9n", "3r"];
    
    vec.sort_by_key(|s| {
        // 提取第二个字符作为第一排序键(示例中n/r/s的顺序符合ASCII自然排序)
        let group_key = s.chars().nth(1).unwrap();
        // 提取第一个字符并转为数字作为第二排序键
        let num_key = s.chars().nth(0).unwrap().to_digit(10).unwrap();
        (group_key, num_key)
    });
    
    println!("{:?}", vec);
    // 输出: ["1n", "1n", "2n", "5n", "9n", "3r", "3r", "6r", "7r", "1s", "1s", "1s", "2s"]
}

为什么这是惯用写法?

  • sort_by_key比sort_by更简洁,直接映射出排序依据,无需手动编写复杂的比较逻辑。
  • Rust对元组的比较是内置行为:先比较元组第一个元素(分组字符),只有当分组相同时,才会比较第二个元素(数字值),完全贴合你的排序规则。

若需手动编写比较逻辑(使用sort_by)

如果场景需要更灵活的控制,也可以用sort_by配合cmp实现:

vec.sort_by(|a, b| {
    let a_group = a.chars().nth(1).unwrap();
    let b_group = b.chars().nth(1).unwrap();
    let group_cmp = a_group.cmp(&b_group);

    if group_cmp == std::cmp::Ordering::Equal {
        let a_num = a.chars().nth(0).unwrap().to_digit(10).unwrap();
        let b_num = b.chars().nth(0).unwrap().to_digit(10).unwrap();
        a_num.cmp(&b_num)
    } else {
        group_cmp
    }
});

不过显然sort_by_key的写法更直观简洁,是这类排序场景的首选方案。

内容的提问来源于stack exchange,提问作者Olaf_k

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 20:57:10