如何对含可选值的数组排序?将None值移至数组头部
Rust:将数组中的None值排序到左侧
首先需要注意两个关键前提:
- 数组必须声明为可变(
mut)才能执行排序操作 Foo结构体需要实现Debugtrait,才能通过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
相关产品推荐
相关产品推荐

