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

如何对含可选值的数组排序?将None值移至数组头部

Rust:将数组中的None值排序到左侧

首先需要注意两个关键前提:

  • 数组必须声明为可变(mut)才能执行排序操作
  • Foo结构体需要实现Debug trait,才能通过println!("{:?}", ...)打印输出

方法一:自定义排序规则(灵活可控)

使用sort_by方法自定义排序逻辑,明确指定None的优先级高于Some:

#[derive(Debug)]
struct Foo;

fn main() {
    let mut array: [Option<Foo>; 5] = [
        Some(Foo {}), 
        Some(Foo {}), 
        None, 
        Some(Foo {}), 
        None
    ]; 

    array.sort_by(|a, b| match (a, b) {
        (None, None) => std::cmp::Ordering::Equal,
        (None, Some(_)) => std::cmp::Ordering::Less, // None 排在 Some 前面
        (Some(_), None) => std::cmp::Ordering::Greater,
        (Some(_), Some(_)) => std::cmp::Ordering::Equal, // 所有 Some 视为相等
    });

    println!("{:?}", array); // 输出: [None, None, Some(Foo), Some(Foo), Some(Foo)]
}

方法二:用排序键简化代码(更简洁)

通过sort_by_key给None和Some分配不同的排序权重,实现更简洁的代码:

#[derive(Debug)]
struct Foo;

fn main() {
    let mut array: [Option<Foo>; 5] = [
        Some(Foo {}), 
        Some(Foo {}), 
        None, 
        Some(Foo {}), 
        None
    ]; 

    // 给 None 分配更小的键值(0),让它排在所有 Some(键值1)前面
    array.sort_by_key(|item| if item.is_none() { 0 } else { 1 });

    println!("{:?}", array); // 输出: [None, None, Some(Foo), Some(Foo), Some(Foo)]
}

保持Some元素的相对顺序(稳定排序)

如果需要保留原数组中Some元素的原有相对顺序,替换为stable_sort_by_key即可:

array.stable_sort_by_key(|item| if item.is_none() { 0 } else { 1 });

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 02:06:52