Flutter对象数组按order字段规则保留null位置重排序实现问题
Flutter 自定义对象数组排序实现
核心实现逻辑如下:
- 拆分原数组为两组:
order非空的元素组、order为null的元素组,null组严格保留原数组中的相对顺序 - 将
order非空的元素组按order值升序排序 - 初始化和原数组长度一致的结果数组,先将排序后的非空元素按自身
order值填充到结果数组对应的索引位置 - 遍历结果数组的空位,按顺序填充
null组的元素
完整代码实现
1. 定义数据模型
class Item { final int id; final int? order; Item({required this.id, this.order}); @override String toString() => 'Item(id: $id, order: $order)'; }
2. 排序逻辑实现
void main() { // 输入示例数组 final List<Item> originalList = [ Item(id: 1, order: 1), Item(id: 2, order: null), Item(id: 3, order: 0), Item(id: 4, order: null), Item(id: 5, order: 3), ]; // 拆分并排序非空order元素 final sortedNonNullItems = originalList .where((item) => item.order != null) .toList() ..sort((a, b) => a.order!.compareTo(b.order!)); // 收集order为null的元素,保留原相对顺序 final nullItems = originalList.where((item) => item.order == null).toList(); // 初始化结果数组 final List<Item?> result = List.filled(originalList.length, null); // 填充非空order元素到对应索引位 for (var item in sortedNonNullItems) { result[item.order!] = item; } // 填充空位为null组元素 int nullIndex = 0; for (int i = 0; i < result.length; i++) { if (result[i] == null) { result[i] = nullItems[nullIndex++]; } } // 转换为非空数组得到最终结果 final finalResult = result.cast<Item>(); print(finalResult); }
运行输出
[Item(id: 3, order: 0), Item(id: 1, order: 1), Item(id: 2, order: null), Item(id: 5, order: 3), Item(id: 4, order: null)]
和要求的期望输出完全一致。
如果存在
order值重复、超出数组长度范围的场景,可根据业务需求提前对order值做合法性校验、自动修正后再执行上述排序逻辑即可。
内容的提问来源于stack exchange,提问作者Snivio
相关产品推荐
相关产品推荐

