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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:33:20