Dart按品牌分组并计算车辆数量总和实现方案
如何合并Dart中相同品牌的Car列表并计算数量总和?
嘿,这个需求很常见,我来给你两种可行的实现方式,都能精准得到你想要的结果——把相同品牌的车辆数量合并,最终得到仅包含各品牌总数量的Car列表。
首先先确认下你的Car类结构(我假设是这样的,如果你的类有细微差别,调整对应字段即可):
class Car { final String brand; int quantity; Car(this.brand, this.quantity); // 可选:重写toString方便查看输出结果 @override String toString() => 'Car(brand: $brand, quantity: $quantity)'; }
方法一:使用dart:collection的groupBy(简洁高效)
这种方法借助Dart标准库的groupBy函数快速分组,再通过fold计算总和,代码简洁易读:
import 'dart:collection'; void main() { // 初始化你的原始Car列表 List<Car> cars = [ Car("nissan", 2), Car("nissan", 4), Car("toyota", 3), Car("nissan", 5), Car("toyota", 2), ]; // 1. 按品牌分组,得到键为品牌名、值为对应Car列表的Map var groupedCars = groupBy(cars, (Car car) => car.brand); // 2. 遍历分组,计算每个品牌的总数量并生成新的Car列表 List<Car> summedCars = groupedCars.entries.map((entry) { final brand = entry.key; final totalQuantity = entry.value.fold(0, (sum, car) => sum + car.quantity); return Car(brand, totalQuantity); }).toList(); // 输出结果,会得到你要的[Car(brand: nissan, quantity: 11), Car(brand: toyota, quantity: 5)] print(summedCars); }
代码解释:
groupBy:把原始列表按brand字段分组,帮你快速把相同品牌的Car归到一起;fold:对每个品牌的Car列表做累加计算,初始值是0,每次迭代把当前Car的quantity加到总和里;map+toList():把分组后的Map转换成你需要的List<Car>格式。
方法二:手动遍历累加(无需额外依赖)
如果不想导入dart:collection,也可以手动遍历原始列表,用一个临时Map来记录各品牌的总数量,最后再转成Car列表:
void main() { List<Car> cars = [ Car("nissan", 2), Car("nissan", 4), Car("toyota", 3), Car("nissan", 5), Car("toyota", 2), ]; // 临时Map,用来存每个品牌的总数量 Map<String, int> brandQuantityMap = {}; // 遍历原始列表,累加数量 for (var car in cars) { if (brandQuantityMap.containsKey(car.brand)) { // 品牌已存在,累加数量 brandQuantityMap[car.brand] = brandQuantityMap[car.brand]! + car.quantity; } else { // 品牌第一次出现,初始化数量 brandQuantityMap[car.brand] = car.quantity; } } // 把Map转换成目标Car列表 List<Car> summedCars = brandQuantityMap.entries .map((entry) => Car(entry.key, entry.value)) .toList(); print(summedCars); }
这种方法逻辑更直观,适合新手理解,而且不需要依赖任何额外的库,直接就能运行。
内容的提问来源于stack exchange,提问作者Aexperty
相关产品推荐
相关产品推荐

