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

如何对Dart列表按日期排序后,按日期分组生成对应子列表?

按日期分组生成子列表的Dart实现

你已经搞定了列表排序,接下来实现按日期分组其实很简单,我给你两种实用方案,按需选择就行:

方案一:手动遍历分组(直观易理解)

这种方式不需要额外依赖,完全靠原生Dart代码实现,适合想搞懂分组逻辑的场景:

void main() {
  List<Example> exampleList = [
    Example("Marc", "21.01.2021"),
    Example("Tobi", "21.01.2021"),
    Example("Lucy", "28.01.2021"),
    Example("Tim", "29.01.2021")
  ];
  
  // 你已经完成的排序步骤
  exampleList.sort((a,b) => a.date.compareTo(b.date));
  
  // 创建分组容器:用日期字符串做键,对应日期的Example列表做值
  Map<String, List<Example>> groupedByDate = {};
  
  // 遍历排序后的列表,逐个归类
  for (var item in exampleList) {
    // 如果当前日期还没有对应的列表,先初始化一个空列表
    groupedByDate.putIfAbsent(item.date, () => []);
    // 将当前项添加到对应日期的列表里
    groupedByDate[item.date]!.add(item);
  }
  
  // 打印验证分组结果
  groupedByDate.forEach((date, items) {
    print("=== 日期 $date 的项 ===");
    items.forEach((item) => print(item.name));
  });
}

class Example {
  String name;
  String date;
  Example(this.name, this.date);
}

方案二:用collection包的groupBy(简洁高效)

如果想少写代码,可以用Dart官方维护的collection包,它提供了现成的分组工具函数:

  1. 先在pubspec.yaml里添加依赖:
dependencies:
  collection: ^1.17.2 # 可以替换为最新版本
  1. 然后修改代码:
import 'package:collection/collection.dart';

void main() {
  List<Example> exampleList = [
    Example("Marc", "21.01.2021"),
    Example("Tobi", "21.01.2021"),
    Example("Lucy", "28.01.2021"),
    Example("Tim", "29.01.2021")
  ];
  
  exampleList.sort((a,b) => a.date.compareTo(b.date));
  
  // 一行代码完成分组,指定分组依据为item的date字段
  Map<String, List<Example>> groupedByDate = groupBy(exampleList, (Example item) => item.date);
  
  // 输出结果
  groupedByDate.forEach((date, items) {
    print("=== 日期 $date 的项 ===");
    items.forEach((item) => print(item.name));
  });
}

class Example {
  String name;
  String date;
  Example(this.name, this.date);
}

额外说明

  • 两种方案最终都会生成你需要的三个子列表,分别对应21.01.2021、28.01.2021、29.01.2021三个日期
  • 如果要单独取出某一个日期的子列表,直接用groupedByDate["21.01.2021"]就能拿到
  • 因为你的日期是dd.mm.yyyy格式的字符串,用compareTo排序刚好和实际日期顺序一致;如果是其他格式(比如yyyy-mm-dd之外的非标准格式),建议先把字符串转成DateTime对象再排序和分组,避免出现排序错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 17:42:44