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
相关产品推荐
相关产品推荐

