如何在Dart中计算列表分组对象的平均值并去重
Dart:高效处理重复X轴数据的Y值平均与去重
给定如下数据类:
class CartesianChartData { CartesianChartData(this.x, this.y); final String x; final double? y; }
以及包含重复X值的列表:
List<CartesianChartData> myList = [ CartesianChartData('A', 25), CartesianChartData('A', 50), CartesianChartData('B', 25), CartesianChartData('B', 75), CartesianChartData('C', 100), CartesianChartData('D', 25), CartesianChartData('E', 0), ];
要高效计算重复X值对应的Y值平均值并去重,最优方案是利用Map分组统计,时间复杂度为O(n)(仅需遍历一次原列表),具体实现如下:
实现代码
// 初始化Map,用于存储每个X值对应的Y总和与出现次数 final Map<String, (double sum, int count)> stats = {}; // 遍历原列表,统计数据 for (final data in myList) { // 跳过Y值为null的条目(可根据业务需求调整) if (data.y == null) continue; final xKey = data.x; final currentStats = stats[xKey]; if (currentStats != null) { // 已有该X值,累加总和与计数 stats[xKey] = (currentStats.sum + data.y!, currentStats.count + 1); } else { // 首次出现该X值,初始化统计数据 stats[xKey] = (data.y!, 1); } } // 将统计结果转换为去重后的目标列表 final processedList = stats.entries.map((entry) { final avgY = entry.value.sum / entry.value.count; return CartesianChartData(entry.key, avgY); }).toList();
结果验证
运行后processedList即为期望的去重且计算好平均值的列表:
[ CartesianChartData('A', 37.5), CartesianChartData('B', 50), CartesianChartData('C', 100), CartesianChartData('D', 25), CartesianChartData('E', 0), ]
补充:用fold简化写法
如果偏好函数式风格,可使用fold方法实现统计逻辑:
final stats = myList.fold<Map<String, (double sum, int count)>>({}, (acc, data) { if (data.y == null) return acc; acc[data.x] = acc.containsKey(data.x) ? (acc[data.x]!.sum + data.y!, acc[data.x]!.count + 1) : (data.y!, 1); return acc; }); final processedList = stats.entries.map((e) => CartesianChartData(e.key, e.value.sum / e.value.count)).toList();
内容的提问来源于stack exchange,提问作者Melom
相关产品推荐
相关产品推荐

