如何对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包,它提供了现成的分组工具函数:
- 先在
pubspec.yaml里添加依赖:
dependencies: collection: ^1.17.2 # 可以替换为最新版本
- 然后修改代码:
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
相关产品推荐
相关产品推荐

