algorithm - Dart - 将对象列表推送到 First Class Lists 列表的最佳排序算法
问题描述
我有一个从数据库中检索到的对象列表。该对象如下所示:
class MonthlyFinancePlan {
final int id;
final DateTime date;
final double incomeAfterTax;
final double totalToPayOut;
final double totalRemainingForMonth;
final Map<String, dynamic> items;
MonthlyFinancePlan({ this.id, this.date, this.incomeAfterTax, this.totalToPayOut, this.totalRemainingForMonth, this.items });
MonthlyFinancePlan.fromEntity(MonthlyFinancePlanEntity monthlyFinancePlanEntity):
this.id = monthlyFinancePlanEntity.id,
this.date = DateTime.parse(monthlyFinancePlanEntity.date),
this.incomeAfterTax = monthlyFinancePlanEntity.incomeAfterTax.toDouble(),
this.totalToPayOut = monthlyFinancePlanEntity.totalToPayOut.toDouble(),
this.totalRemainingForMonth = monthlyFinancePlanEntity.moneyRemainingForMonth.toDouble(),
this.items = monthlyFinancePlanEntity.items != null ? json.decode(monthlyFinancePlanEntity.items) : Map();
}
我需要对它们进行排序date.year
,然后将它们传递到第一类列表中,我想创建这些第一类列表的列表,以便对MonthlyFinancePlan
2020 年的所有对象进行排序并包含在第一类列表中, 2021 年也一样,等等。
第一类列表如下所示:
class YearlyFinancePlan {
List<MonthlyFinancePlan> _monthlyFinancePlanList;
int _year;
double _totalIncomeForYear;
double _totalOutGoingsForYear;
List<MonthlyFinancePlan> get items {
return this._monthlyFinancePlanList;
}
int get year {
return this._year;
}
double get totalIncomeForYear {
return this._totalIncomeForYear;
}
double get totalOutgoingsForYear {
return this._totalOutGoingsForYear;
}
YearlyFinancePlan(this._monthlyFinancePlanList) {
this._year = this._monthlyFinancePlanList.first.date.year;
this._totalIncomeForYear = this._setTotalIncomeFromList(this._monthlyFinancePlanList);
this._totalOutGoingsForYear = this._setTotalOutGoingsForYear(this._monthlyFinancePlanList);
}
double _setTotalIncomeFromList(List<MonthlyFinancePlan> monthlyFinancePlanList) {
double totalIncome;
monthlyFinancePlanList.forEach((plan) => totalIncome += plan.incomeAfterTax);
return totalIncome;
}
double _setTotalOutGoingsForYear(List<MonthlyFinancePlan> monthlyFinancePlanList) {
double totalOutgoings;
monthlyFinancePlanList.forEach((plan) => totalOutgoings += plan.totalToPayOut);
return totalOutgoings;
}
}
我的问题是,哪种排序算法最适合我的需要?我没有任何代码可以显示,因为我不知道要使用哪种排序算法。我不是在寻找任何人来编写我的代码,而是更多地指导我完成它。
任何帮助将不胜感激
解决方案
我创建了一个 Mapper,它检查是否MonthlyPlanner.date.year
存在作为标准 Dart Map 中的键,如果不存在则添加它。检查完成后,它还会调用该addMonthlyPlan
方法将条目添加MonthlyPlan
到正确的位置YearlyPlan
,如下所示:
class FinancePlanMapper {
static Map<int, YearlyFinancePlan> toMap(List<MonthlyFinancePlan> planList) {
Map<int, YearlyFinancePlan> planMap = Map();
planList.forEach((monthlyPlan) {
planMap.putIfAbsent(monthlyPlan.date.year, () => YearlyFinancePlan(List()));
planMap[monthlyPlan.date.year].addMonthlyPlan(monthlyPlan);
});
return planMap;
}
}
我不太确定这是否是最有效的排序方式,但我计划尽可能地重构它。我还更新了YearlyFinancePlan
对象,使其不会在构造时初始化任何字段,这会导致对象在使用空列表初始化时引发错误:
class YearlyFinancePlan {
List<MonthlyFinancePlan> _monthlyFinancePlanList;
List<MonthlyFinancePlan> get items {
return this._monthlyFinancePlanList;
}
int get year {
return this.items.first.date.year;
}
double get totalIncomeForYear {
return this._setTotalIncomeFromList(this._monthlyFinancePlanList);
}
double get totalOutgoingsForYear {
return this._setTotalOutGoingsForYear(this._monthlyFinancePlanList);
}
YearlyFinancePlan(this._monthlyFinancePlanList);
void addMonthlyPlan(MonthlyFinancePlan plan) {
this._monthlyFinancePlanList.add(plan);
}
double _setTotalIncomeFromList(List<MonthlyFinancePlan> monthlyFinancePlanList) {
double totalIncome = 0;
monthlyFinancePlanList.forEach((plan) => totalIncome += plan.incomeAfterTax);
return totalIncome;
}
double _setTotalOutGoingsForYear(List<MonthlyFinancePlan> monthlyFinancePlanList) {
double totalOutgoings = 0;
monthlyFinancePlanList.forEach((plan) => totalOutgoings += plan.totalToPayOut);
return totalOutgoings;
}
}
推荐阅读
- javascript - 如何从多个过去的页面 JavaScript 中获取字符串 URL
- c - c中分配的混乱
- python - 在 AWS 上使用 python 连接到服务器
- google-sheets - Google 表格中的货币条件格式
- highcharts - Highcharts - 有没有办法为某些元素禁用样式模式?
- sql - 如何使用 PIVOT 按日期排列数据
- grafana - 如何在没有 gpcc 和 gpperfmon 的情况下收集 greenplum 监视器指标
- java - 如何测量 Kamon 在 Prometheus 上的 WSClient 请求的处理时间?
- android-studio - 使用 Android Studio/Intellij 在 Find Usage 搜索中隐藏自动生成的 Hilt 类
- python - django / 将多个模型传递给我的 ListView