我正在尝试获取列表中每个对象的平均值

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()}');
}

~/ 运算符表示除法,返回整数结果。

至于打印出你喜欢的语句,你需要将每张地图转换成一个列表。我不完全确定为什么需要这样做,您只需将其保留为地图并将新分数设置为平均值就可以了。