如何将列表中年份相同的Event元素分组为嵌套列表
按年份分组Event列表的解决方案
原生Dart实现(无第三方依赖)
先对列表排序(保证子列表内事件按时间有序,可选但推荐),再通过Map完成分组:
List<List<Event>> groupEventsByYear(List<Event> eventList) { // 按时间排序事件列表 eventList.sort((a, b) => a.eventTime.compareTo(b.eventTime)); // 初始化分组Map,key为年份,value为对应年份的Event列表 final Map<int, List<Event>> yearGroups = {}; for (final event in eventList) { final year = event.eventTime.year; // 若当前年份无对应列表则创建,再添加事件 yearGroups.putIfAbsent(year, () => []).add(event); } // 将Map的value集合转为目标格式List<List<Event>> return yearGroups.values.toList(); }
借助collection包简化实现
如果可以引入第三方工具包,使用collection里的groupBy方法能大幅简化代码:
- 先添加依赖:
dart pub add collection
- 实现分组:
import 'package:collection/collection.dart'; List<List<Event>> groupEventsByYear(List<Event> eventList) { eventList.sort((a, b) => a.eventTime.compareTo(b.eventTime)); // 直接按年份分组,再转换为目标格式 return groupBy(eventList, (Event e) => e.eventTime.year).values.toList(); }
效果验证
用你提供的示例列表调用上述方法后,会得到如下结构的结果:
[ [Event(eventTime: 1961-05-12 00:00:00.000)], [Event(eventTime: 1963-05-12 00:00:00.000), Event(eventTime: 1963-05-12 00:00:00.000), Event(eventTime: 1963-05-12 00:00:00.000)], [Event(eventTime: 1964-05-12 00:00:00.000)] ]
内容的提问来源于stack exchange,提问作者matti peter
相关产品推荐
相关产品推荐

