鉴于这张地图:
<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,日期重复两次,但使用不同的日期
2014-09-01 01:50:00.000: 1.26,
2014-09-01 01:50:00.000: 1.26,我怎样才能在地图上做到这一点?
发布于 2022-08-02 13:20:58
当前的映射包含多个键,这些键将被视为相同的对象,因为DateTime覆盖了==和.hashCode,因此指向同一时间点的两个DateTime将被视为相等:https://api.dart.dev/stable/2.17.6/dart-core/DateTime/operator_equals.html。
这意味着,如果我们正常地尝试创建Map,我们将得到以下结果:
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):
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)
}如果我们想将应该被视为相等的键组合起来,我们可以这样做:
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)
}https://stackoverflow.com/questions/73207395
复制相似问题