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

Flutter对象数组按order字段规则保留null位置重排序实现问题

Flutter 自定义对象数组排序实现

核心实现逻辑如下:

  1. 拆分原数组为两组:order非空的元素组、order为null的元素组,null组严格保留原数组中的相对顺序
  2. 将order非空的元素组按order值升序排序
  3. 初始化和原数组长度一致的结果数组,先将排序后的非空元素按自身order值填充到结果数组对应的索引位置
  4. 遍历结果数组的空位,按顺序填充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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 03:36:10