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

Rust开发:如何对结构体组成的Vector按自定义规则排序

实现方案

Rust 标准库的Vec类型内置了排序相关方法,你无需修改原结构体定义,直接通过自定义比较逻辑就能实现按指定字段排序。

按字段a的值排序

sort_by方法支持传入自定义比较闭包,直接对比两个结构体的a字段即可:

fn sort_array(generic_vector: Vec<GenericStruct>) -> Vec<GenericStruct> {
    let mut vec = generic_vector;
    // 按a字段升序排列,要降序就改为 y.a.cmp(&x.a)
    vec.sort_by(|item1, item2| item1.a.cmp(&item2.a));
    vec
}

如果不需要自定义复杂比较逻辑,也可以用更简洁的sort_by_key方法:

fn sort_array(generic_vector: Vec<GenericStruct>) -> Vec<GenericStruct> {
    let mut vec = generic_vector;
    vec.sort_by_key(|item| item.a);
    vec
}

按字段b的字符串长度排序

逻辑和上面一致,只要把比较的key换成b字段的长度即可:

fn sort_array(generic_vector: Vec<GenericStruct>) -> Vec<GenericStruct> {
    let mut vec = generic_vector;
    // 按b的字符串长度升序,长度相同则按字符串字典序排序
    vec.sort_by(|item1, item2| item1.b.len().cmp(&item2.b.len()).then(item1.b.cmp(&item2.b)));
    vec
}

用sort_by_key的简化写法:

vec.sort_by_key(|item| (item.b.len(), item.b.as_str()));

灵活切换排序规则

如果需要在调用函数时动态指定排序规则,可以把比较逻辑作为参数传入:

fn sort_array<F>(mut generic_vector: Vec<GenericStruct>, compare: F) -> Vec<GenericStruct>
where
    F: FnMut(&GenericStruct, &GenericStruct) -> std::cmp::Ordering,
{
    generic_vector.sort_by(compare);
    generic_vector
}

// 调用时指定排序规则
fn main() {
    let some_words = String::from("Hello Word");
    let x = GenericStruct { a: 25, b: some_words };
    let some_vector: Vec<GenericStruct> = vec![x];
    // 按a字段升序排序
    let sorted_by_a = sort_array(some_vector, |a, b| a.a.cmp(&b.a));
    // 按b的长度升序排序
    // let sorted_by_b_len = sort_array(some_vector, |a, b| a.b.len().cmp(&b.b.len()));
}

注意:Rust的排序方法都是原地排序,所以需要先把传入的不可变Vec绑定为可变变量,或者直接声明函数参数为可变的mut generic_vector: Vec<GenericStruct>。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:15:02