我正在尝试获取列表中每个对象的平均值
I am trying to get the average per object in a list
我正在编写一些代码,其中我有一个被添加到很多的列表。每次添加它时,它都有 2 个值:一个字符串和一个整数。
我希望它获取所有这些数据,并获取每个字符串的整数平均值,并将其放入列表中。
示例:
void main() {
List people = [];
people.add({'person': 'mike', 'score': 32});
people.add({'person': 'david', 'score': 29});
people.add({'person': 'mike', 'score': 28});
people.add({'person': 'kim', 'score': 34});
people.add({'person': 'david', 'score': 31});
people.add({'person': 'david', 'score': 31});
people.add({'person': 'kim', 'score': 32});
print(people);
}
上面你可以看到列表people有几个不同的人和分数。我希望当我打印(人)时它显示如下列表:
{['person': 'mike', 'score': 30], ['person': 'david', 'score': 30], ['person': 'kim', 'score': 33]}
如您所见,上面的分数是完整列表的平均列表,双精度四舍五入为整数。
有办法吗?
它需要一些映射。首先在地图中收集每个人的所有分数。然后以所需格式重新创建条目。这可以做得更紧凑一些,但我认为这样更容易阅读。
请注意,此实现 returns 将 double
作为分数而不是 int
。如果不需要,您可以在平均值计算中添加 .round()
。或者按照 Tray Denney 的建议,使用 ~/
运算符除以 returns int,忽略小数。
void main() {
List people = [];
people.add({'person': 'mike', 'score': 32});
people.add({'person': 'david', 'score': 29});
people.add({'person': 'mike', 'score': 28});
people.add({'person': 'kim', 'score': 34});
people.add({'person': 'david', 'score': 31});
people.add({'person': 'david', 'score': 31});
people.add({'person': 'kim', 'score': 32});
final scoresPerPerson = people.fold<Map<String, List<int>>>(
{}, // initial empty map
(map, person) {
final name = person['person'];
map.update(
name,
(scores) => [...scores, person['score']], // update the existing list of scores
ifAbsent: () => [person['score']], // create a new list of scores for this person
);
return map;
},
);
final averages =
scoresPerPerson.entries.map((MapEntry<String, List<int>> item) {
return {
'person': item.key,
'score': item.value.reduce((a, b) => a + b) /
item.value.length, // calculate the average of all scores
};
});
print(averages);
}
为了获得平均值,您需要遍历列表并定位 'score' 键。
void main() {
List people = [];
people.add({'person': 'mike', 'score': 32});
people.add({'person': 'david', 'score': 29});
people.add({'person': 'mike', 'score': 28});
people.add({'person': 'kim', 'score': 34});
people.add({'person': 'david', 'score': 31});
people.add({'person': 'david', 'score': 31});
people.add({'person': 'kim', 'score': 32});
double sum = 0;
for(int i = 0; i < people.length; i++) {
sum += people[i]['score'];
}
int average = sum ~/ people.length;
print('Average: ${average.toString()}');
}
~/ 运算符表示除法,返回整数结果。
至于打印出你喜欢的语句,你需要将每张地图转换成一个列表。我不完全确定为什么需要这样做,您只需将其保留为地图并将新分数设置为平均值就可以了。
我正在编写一些代码,其中我有一个被添加到很多的列表。每次添加它时,它都有 2 个值:一个字符串和一个整数。 我希望它获取所有这些数据,并获取每个字符串的整数平均值,并将其放入列表中。
示例:
void main() {
List people = [];
people.add({'person': 'mike', 'score': 32});
people.add({'person': 'david', 'score': 29});
people.add({'person': 'mike', 'score': 28});
people.add({'person': 'kim', 'score': 34});
people.add({'person': 'david', 'score': 31});
people.add({'person': 'david', 'score': 31});
people.add({'person': 'kim', 'score': 32});
print(people);
}
上面你可以看到列表people有几个不同的人和分数。我希望当我打印(人)时它显示如下列表:
{['person': 'mike', 'score': 30], ['person': 'david', 'score': 30], ['person': 'kim', 'score': 33]}
如您所见,上面的分数是完整列表的平均列表,双精度四舍五入为整数。
有办法吗?
它需要一些映射。首先在地图中收集每个人的所有分数。然后以所需格式重新创建条目。这可以做得更紧凑一些,但我认为这样更容易阅读。
请注意,此实现 returns 将 double
作为分数而不是 int
。如果不需要,您可以在平均值计算中添加 .round()
。或者按照 Tray Denney 的建议,使用 ~/
运算符除以 returns int,忽略小数。
void main() {
List people = [];
people.add({'person': 'mike', 'score': 32});
people.add({'person': 'david', 'score': 29});
people.add({'person': 'mike', 'score': 28});
people.add({'person': 'kim', 'score': 34});
people.add({'person': 'david', 'score': 31});
people.add({'person': 'david', 'score': 31});
people.add({'person': 'kim', 'score': 32});
final scoresPerPerson = people.fold<Map<String, List<int>>>(
{}, // initial empty map
(map, person) {
final name = person['person'];
map.update(
name,
(scores) => [...scores, person['score']], // update the existing list of scores
ifAbsent: () => [person['score']], // create a new list of scores for this person
);
return map;
},
);
final averages =
scoresPerPerson.entries.map((MapEntry<String, List<int>> item) {
return {
'person': item.key,
'score': item.value.reduce((a, b) => a + b) /
item.value.length, // calculate the average of all scores
};
});
print(averages);
}
为了获得平均值,您需要遍历列表并定位 'score' 键。
void main() {
List people = [];
people.add({'person': 'mike', 'score': 32});
people.add({'person': 'david', 'score': 29});
people.add({'person': 'mike', 'score': 28});
people.add({'person': 'kim', 'score': 34});
people.add({'person': 'david', 'score': 31});
people.add({'person': 'david', 'score': 31});
people.add({'person': 'kim', 'score': 32});
double sum = 0;
for(int i = 0; i < people.length; i++) {
sum += people[i]['score'];
}
int average = sum ~/ people.length;
print('Average: ${average.toString()}');
}
~/ 运算符表示除法,返回整数结果。
至于打印出你喜欢的语句,你需要将每张地图转换成一个列表。我不完全确定为什么需要这样做,您只需将其保留为地图并将新分数设置为平均值就可以了。