首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从给定条件的映射中获取平均值​

从给定条件的映射中获取平均值​
EN

Stack Overflow用户
提问于 2022-08-02 12:16:33
回答 1查看 47关注 0票数 1

鉴于这张地图:

代码语言:javascript
复制
<DateTime, double> {
2014-09-01 01:46:00.000: 1.29, 
2014-09-01 01:47:00.000: 1.27, 
2014-09-01 01:48:00.000: 1.27,
2014-09-01 01:48:00.000: 1.27,
2014-09-01 01:49:00.000: 1.26, 
2014-09-01 01:50:00.000: 1.26,
2014-09-01 01:50:00.000: 1.26,
2014-09-01 01:51:00.000: 1.26, 
2014-09-01 01:52:00.000: 1.26,
2014-09-01 01:52:00.000: 1.26,
2014-09-01 01:53:00.000: 1.26, 
2014-09-01 01:54:00.000: 1.27,
2014-09-01 01:54:00.000: 1.27
}

如何仅在日期重复的情况下计算值​​的平均值,例如:对于值1.26和1.27,日期重复两次,但使用不同的日期

代码语言:javascript
复制
2014-09-01 01:50:00.000: 1.26,
2014-09-01 01:50:00.000: 1.26,

我怎样才能在地图上做到这一点?

EN

回答 1

Stack Overflow用户

发布于 2022-08-02 13:20:58

当前的映射包含多个键,这些键将被视为相同的对象,因为DateTime覆盖了==.hashCode,因此指向同一时间点的两个DateTime将被视为相等:https://api.dart.dev/stable/2.17.6/dart-core/DateTime/operator_equals.html

这意味着,如果我们正常地尝试创建Map,我们将得到以下结果:

代码语言:javascript
复制
void main() {
  final map = <DateTime, double>{
    DateTime.parse('2014-09-01 01:46:00.000'): 1.29,
    DateTime.parse('2014-09-01 01:47:00.000'): 1.27,
    DateTime.parse('2014-09-01 01:48:00.000'): 1.27,
    DateTime.parse('2014-09-01 01:48:00.000'): 1.27,
    DateTime.parse('2014-09-01 01:49:00.000'): 1.26,
    DateTime.parse('2014-09-01 01:50:00.000'): 1.26,
    DateTime.parse('2014-09-01 01:50:00.000'): 1.26,
    DateTime.parse('2014-09-01 01:51:00.000'): 1.26,
    DateTime.parse('2014-09-01 01:52:00.000'): 1.26,
    DateTime.parse('2014-09-01 01:52:00.000'): 1.26,
    DateTime.parse('2014-09-01 01:53:00.000'): 1.26,
    DateTime.parse('2014-09-01 01:54:00.000'): 1.27,
    DateTime.parse('2014-09-01 01:54:00.000'): 1.27,
  };

  print(map.length); // 9
  map.entries.forEach(print);
  // MapEntry(2014-09-01 01:46:00.000: 1.29)
  // MapEntry(2014-09-01 01:47:00.000: 1.27)
  // MapEntry(2014-09-01 01:48:00.000: 1.27)
  // MapEntry(2014-09-01 01:49:00.000: 1.26)
  // MapEntry(2014-09-01 01:50:00.000: 1.26)
  // MapEntry(2014-09-01 01:51:00.000: 1.26)
  // MapEntry(2014-09-01 01:52:00.000: 1.26)
  // MapEntry(2014-09-01 01:53:00.000: 1.26)
  // MapEntry(2014-09-01 01:54:00.000: 1.27)
}

因此,即使我们将9元素放入Map中,长度也是Map

我们可以使用Map.identity()映射,只需查看每个对象键的标识,就可以确定密钥是否相等(因此不再使用==.hashCode):

代码语言:javascript
复制
void main() {
  final identityMap = Map<DateTime, double>.identity()
    ..[DateTime.parse('2014-09-01 01:46:00.000')] = 1.29
    ..[DateTime.parse('2014-09-01 01:47:00.000')] = 1.27
    ..[DateTime.parse('2014-09-01 01:48:00.000')] = 1.27
    ..[DateTime.parse('2014-09-01 01:48:00.000')] = 1.26
    ..[DateTime.parse('2014-09-01 01:49:00.000')] = 1.26
    ..[DateTime.parse('2014-09-01 01:50:00.000')] = 1.26
    ..[DateTime.parse('2014-09-01 01:50:00.000')] = 1.26
    ..[DateTime.parse('2014-09-01 01:51:00.000')] = 1.26
    ..[DateTime.parse('2014-09-01 01:52:00.000')] = 1.26
    ..[DateTime.parse('2014-09-01 01:52:00.000')] = 1.26
    ..[DateTime.parse('2014-09-01 01:53:00.000')] = 1.26
    ..[DateTime.parse('2014-09-01 01:54:00.000')] = 1.27
    ..[DateTime.parse('2014-09-01 01:54:00.000')] = 1.27;

  print(identityMap.length); // 13
  identityMap.entries.forEach(print);
  // MapEntry(2014-09-01 01:46:00.000: 1.29)
  // MapEntry(2014-09-01 01:47:00.000: 1.27)
  // MapEntry(2014-09-01 01:48:00.000: 1.27)
  // MapEntry(2014-09-01 01:48:00.000: 1.26)
  // MapEntry(2014-09-01 01:49:00.000: 1.26)
  // MapEntry(2014-09-01 01:50:00.000: 1.26)
  // MapEntry(2014-09-01 01:50:00.000: 1.26)
  // MapEntry(2014-09-01 01:51:00.000: 1.26)
  // MapEntry(2014-09-01 01:52:00.000: 1.26)
  // MapEntry(2014-09-01 01:52:00.000: 1.26)
  // MapEntry(2014-09-01 01:53:00.000: 1.26)
  // MapEntry(2014-09-01 01:54:00.000: 1.27)
  // MapEntry(2014-09-01 01:54:00.000: 1.27)
}

如果我们想将应该被视为相等的键组合起来,我们可以这样做:

代码语言:javascript
复制
void main() {
  final identityMap = Map<DateTime, double>.identity()
    ..[DateTime.parse('2014-09-01 01:46:00.000')] = 1.29
    ..[DateTime.parse('2014-09-01 01:47:00.000')] = 1.27
    ..[DateTime.parse('2014-09-01 01:48:00.000')] = 1.27
    ..[DateTime.parse('2014-09-01 01:48:00.000')] = 1.26
    ..[DateTime.parse('2014-09-01 01:49:00.000')] = 1.26
    ..[DateTime.parse('2014-09-01 01:50:00.000')] = 1.26
    ..[DateTime.parse('2014-09-01 01:50:00.000')] = 1.26
    ..[DateTime.parse('2014-09-01 01:51:00.000')] = 1.26
    ..[DateTime.parse('2014-09-01 01:52:00.000')] = 1.26
    ..[DateTime.parse('2014-09-01 01:52:00.000')] = 1.26
    ..[DateTime.parse('2014-09-01 01:53:00.000')] = 1.26
    ..[DateTime.parse('2014-09-01 01:54:00.000')] = 1.27
    ..[DateTime.parse('2014-09-01 01:54:00.000')] = 1.27;

  // Step 1 - First create a map where we collect all values with the same key
  //          value (based on `==` and `.hashCode`).
  final tempMap = <DateTime, List<double>>{};
  for (final entry in identityMap.entries) {
    tempMap.update(
      entry.key,
      (value) => value..add(entry.value),
      ifAbsent: () => [entry.value],
    );
  }
  tempMap.entries.forEach(print);
  // MapEntry(2014-09-01 01:46:00.000: [1.29])
  // MapEntry(2014-09-01 01:47:00.000: [1.27])
  // MapEntry(2014-09-01 01:48:00.000: [1.27, 1.26])
  // MapEntry(2014-09-01 01:49:00.000: [1.26])
  // MapEntry(2014-09-01 01:50:00.000: [1.26, 1.26])
  // MapEntry(2014-09-01 01:51:00.000: [1.26])
  // MapEntry(2014-09-01 01:52:00.000: [1.26, 1.26])
  // MapEntry(2014-09-01 01:53:00.000: [1.26])
  // MapEntry(2014-09-01 01:54:00.000: [1.27, 1.27])

  // Step 2 - Go though each entry in our `tempMap` and take the average of the
  //          values collected and create a new `Map` based on this.
  final resultMap = tempMap.map((key, value) =>
      MapEntry(key, value.reduce((a, b) => a + b) / value.length));

  resultMap.entries.forEach(print);
  // MapEntry(2014-09-01 01:46:00.000: 1.29)
  // MapEntry(2014-09-01 01:47:00.000: 1.27)
  // MapEntry(2014-09-01 01:48:00.000: 1.2650000000000001)
  // MapEntry(2014-09-01 01:49:00.000: 1.26)
  // MapEntry(2014-09-01 01:50:00.000: 1.26)
  // MapEntry(2014-09-01 01:51:00.000: 1.26)
  // MapEntry(2014-09-01 01:52:00.000: 1.26)
  // MapEntry(2014-09-01 01:53:00.000: 1.26)
  // MapEntry(2014-09-01 01:54:00.000: 1.27)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73207395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档