【问题标题】:How to create a new list from two partial lists & based on one partial list?如何从两个部分列表和基于一个部分列表创建一个新列表?
【发布时间】:2021-12-16 16:40:45
【问题描述】:

这需要一些我在 Dart 中还没有的天才、经验和知识,所以我正在寻求帮助。

我正在尝试填充折线图,当用户第一次开始使用软件时,图表数据中会有“空”条目。也可能有“零”条目或几个星期或条目根本没有条目。我想确保基于始终显示 13 个条目的图表,我的折线图对于任何缺失的条目显示为零(对于销售收入 - yAxis)。

例如,mockupGraphData 是一种现有情况,其中几个销售日期缺少条目(基于每周条目)并且没有足够的条目来满足图表需求。

我想自动输入“归零”日期。其中日期是缺失日期的索引,GraphData.yAxis(收入)为零。

下面当然不会编译,考虑最后一个循环伪代码,我认为如果我可以绕过 mockupGraphData 中不存在的索引...

void main() {
  
  // Actual "mock" input data
  List<GraphData> mockupGraphData = [
    GraphData(1586761200000, 145333),
    GraphData(1587366000000, 433343),
    GraphData(1587970800000, 223432),
    GraphData(1589180400000, 122221),
    GraphData(1589785200000, 982347),
    GraphData(1590994800000, 234322),
  ];
  
  // Required graph dates as per below calculations (13 entries):
    // 1583737200000
    // 1584342000000
    // 1584946800000
    // 1585551600000
    // 1586156400000
    // 1586761200000
    // 1587366000000
    // 1587970800000
    // 1588575600000
    // 1589180400000
    // 1589785200000
    // 1590390000000
    // 1590994800000

  int entries = 13;
  int latestDateReported = DateTime(2020, 6, 1).millisecondsSinceEpoch;
  int oneWeek = Duration(days: 7).inMilliseconds;
  int earliestEntryDate = latestDateReported - (oneWeek * entries);
  List<int> graphRequiredDates = [];
  List<GraphData> finalData = [];
  
  for (int i = 0; i < entries; i++) {
    earliestEntryDate += oneWeek;
    graphRequiredDates.add(earliestEntryDate);
  }
  // What I would like to do
  for (int i = 0; i < entries; i++) {
    if (!mockupGraphData.contains(GraphData(graphRequiredDates[i]))) {
      finalData.add(GraphData(graphRequiredDates[i], 0));
    }
  }
  
  print(finalData);
}

class GraphData {
    int xAxis; // Sale date
    int yAxis; // Sale income
  
  GraphData(this.xAxis, this.yAxis);
  
  @override
  String toString() {
    return '$xAxis $yAxis';
  }
  }
// IDEAL OUTPUT:
  List<GraphData> mockupGraphData = [
    GraphData(1583737200000, 0),
    GraphData(1584342000000, 0),
    GraphData(1584946800000, 0),
    GraphData(1585551600000, 0),
    GraphData(1586156400000, 0),
    GraphData(1586761200000, 145333),
    GraphData(1587366000000, 433343),
    GraphData(1587970800000, 223432),
    GraphData(1588575600000, 0),
    GraphData(1589180400000, 122221),
    GraphData(1589785200000, 982347),
    GraphData(1590390000000, 0),
    GraphData(1590994800000, 234322),
  ];

【问题讨论】:

    标签: flutter loops dart arraylist


    【解决方案1】:

    我不会将mockupGraphData 存储为List&lt;GraphData&gt;,而是使用将时间戳映射到值的Map&lt;int, int&gt;。从那里,很容易遍历您的预期时间戳列表,检查时间戳是否已存在于 mockupGraphData 中,然后适当地构造 GraphData 对象。

    您还可以使用 collection-for 使您的一些代码更整洁:

    void main() {
      // Actual "mock" input data
    
      var mockupGraphData = <int, int>{
        1586761200000: 145333,
        1587366000000: 433343,
        1587970800000: 223432,
        1589180400000: 122221,
        1589785200000: 982347,
        1590994800000: 234322,
      };
    
      int entries = 13;
      int latestDateReported = DateTime(2020, 6, 1).millisecondsSinceEpoch;
      int oneWeek = Duration(days: 7).inMilliseconds;
      int earliestEntryDate = latestDateReported - (oneWeek * (entries - 1));
      List<int> graphRequiredDates = [
        for (var i = 0; i < entries; i++)
          earliestEntryDate + i * oneWeek,
      ];
      List<GraphData> finalData = [
        for (var requiredDate in graphRequiredDates)
          GraphData(requiredDate, mockupGraphData[requiredDate] ?? 0),
      ];
    
      finalData.forEach(print);
    }
    
    class GraphData {
      int xAxis; // Sale date
      int yAxis; // Sale income
    
      GraphData(this.xAxis, this.yAxis);
    
      @override
      String toString() {
        return 'GraphData($xAxis, $yAxis)';
      }
    }
    

    【讨论】:

    • 很高兴得到一些有经验的人的关注,谢谢。不久之后,我以一种草率的方式解决了这个问题。我更喜欢这种方式,不同的角度。
    【解决方案2】:

    你可以试试这样的:

    void main() {
      List<GraphData> mockupGraphData = [
        GraphData(1586761200000, 145333),
        GraphData(1587366000000, 433343),
        GraphData(1587970800000, 223432),
        GraphData(1589180400000, 122221),
        GraphData(1589785200000, 982347),
        GraphData(1590994800000, 234322),
      ];
    
      int entries = 13;
      int latestDateReported = DateTime(2020, 6, 1).millisecondsSinceEpoch;
      int oneWeek = Duration(days: 7).inMilliseconds;
      int earliestEntryDate = 1583737200000;
    
      final result = [
        for (int i = 0, v = 0; i < entries; i++, earliestEntryDate += oneWeek)
          if (mockupGraphData[v].xAxis == earliestEntryDate)
            mockupGraphData[v++]
          else
            GraphData(earliestEntryDate, 0),
      ];
    
      result.forEach(print);
    }
    
    class GraphData {
      int xAxis; // Sale date
      int yAxis; // Sale income
    
      GraphData(this.xAxis, this.yAxis);
    
      @override
      String toString() {
        return '$xAxis $yAxis';
      }
    }
    

    我硬编码了earliestEntryDate 的值,因为计算似乎与预期的输出不匹配。上述解决方案假定 mockupGraphData 已排序,并且这些值至少相隔一周。

    【讨论】:

      猜你喜欢
      • 2021-09-17
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      相关资源
      最近更新 更多