首页 > 解决方案 > 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,然后将它们传递到第一类列表中,我想创建这些第一类列表的列表,以便对MonthlyFinancePlan2020 年的所有对象进行排序并包含在第一类列表中, 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;
  }
}

我的问题是,哪种排序算法最适合我的需要?我没有任何代码可以显示,因为我不知道要使用哪种排序算法。我不是在寻找任何人来编写我的代码,而是更多地指导我完成它。

任何帮助将不胜感激

标签: algorithmfluttersortingdart

解决方案


我创建了一个 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;
  }
}

推荐阅读