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

Dart中如何对列表内同title对象的num属性求和?求最简解法

问题

需求:遍历Dart对象列表,对每个相同title对应的num属性值进行求和。

当前代码运行输出:

--- Hi : 0
--- Hi : 0
--- Hello : 0
--- Hello : 0
--- Good : 0

期望输出:

--- Hi : 19
--- Hello : 15
--- Good : 12

现有代码:

var obj1 = MyObject(tNum: 10, tTitle: 'Hi');
var obj2 = MyObject(tNum: 9, tTitle: 'Hi');
var obj3 = MyObject(tNum: 8, tTitle: 'Hello');
var obj4 = MyObject(tNum: 7, tTitle: 'Hello');
var obj5 = MyObject(tNum: 12, tTitle: 'Good');
var myList = [obj1, obj2, obj3, obj4, obj5];

var myListIter = myList.iterator;
var initialTitle = '';
var finalSum = 0;

while (myListIter.moveNext()) {
  print(myListIter.current);
  if (myListIter.current.title!.compareTo(initialTitle).isEven) {
    finalSum = finalSum + myListIter.current.num!;
  }else{
    print('--- ${myListIter.current.title!} : $finalSum');
  }
}

class MyObject {
  int? num;
  String? title;
  MyObject({tNum, tTitle}) {
    num = tNum;
    title = tTitle;
  }
}
最简实现方法

原代码逻辑存在根本性错误:用compareTo结果的奇偶性判断标题是否完全不成立,且未正确处理标题切换时的累加与输出逻辑。

最简方案是利用Map分组累加,只需遍历一次列表即可完成求和,代码简洁高效:

var obj1 = MyObject(tNum: 10, tTitle: 'Hi');
var obj2 = MyObject(tNum: 9, tTitle: 'Hi');
var obj3 = MyObject(tNum: 8, tTitle: 'Hello');
var obj4 = MyObject(tNum: 7, tTitle: 'Hello');
var obj5 = MyObject(tNum: 12, tTitle: 'Good');
var myList = [obj1, obj2, obj3, obj4, obj5];

// 用Map存储每个title对应的num总和
final sumMap = <String, int>{};
for (final obj in myList) {
  // 这里假设title和num不为null,若需兼容null可替换为obj.title ?? '默认标题'、obj.num ?? 0
  final title = obj.title!;
  final num = obj.num!;
  sumMap[title] = (sumMap[title] ?? 0) + num;
}

// 输出结果
sumMap.forEach((title, total) => print('--- $title : $total'));

class MyObject {
  int? num;
  String? title;
  // 优化构造函数,用required明确必填参数,避免潜在的空值问题
  MyObject({required int tNum, required String tTitle})
      : num = tNum,
        title = tTitle;
}

逻辑说明

  • 用Map<String, int>的key存储title,value存储对应num的累加值;
  • 遍历列表时,若当前title已在Map中,就将对应value加上当前num;若不存在,则初始化为0后再加当前num;
  • 最后遍历Map直接输出每组的结果,时间复杂度为O(n),仅需一次遍历即可完成所有操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 08:30:47