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
相关产品推荐
相关产品推荐

