计算hashmap中的值的平均值

时间:2016-11-09 14:19:40

标签: java hashmap

我正在创建一个计算班级中男女学生平均分数的应用程序

 Name class marks gender
  abc   1    20    M
  REF   1    30    F
  def   2    30    F
  xyz   1    40    M
  dsf   3    20    F
  wer   2    10    F

我希望最终输出为

   class gender  average
    1     M       30 
    1     F       30
    2     F       20

即男性和女性的平均分等级

我创建了一个以值为输入的地图

键作为类和值作为完整的学生对象

哪种方法更好 为女性和男性创建两个单独的地图 计算平均值然后单独计算

只有一张地图

1 个答案:

答案 0 :(得分:1)

您可能只使用一张地图。请注意,下面的代码远非理想,它需要一些重构。它仅用于演示目的。假设我们有2个课程StudentAverage

    class Student {
        private String gender;
        private Integer mark;
        private String name;
        // getters & setters
        ...            
    }
    class Average {
        private String gender;
        private Double average;
        // getters & setters    
        ...
    }

我们有一个学生班级地图

Map<String,List<Student>> course = new HashMap<>();

现在使用Stream API我们可以做这样的事情

Map<String,List<Average>> map = course.entrySet().stream().collect(Collectors.toMap(
            Map.Entry::getKey, e ->
            Arrays.asList(
                    new Average("f", e.getValue().stream().filter(student -> student.getGender().equals("f"))
                            .mapToInt(Student::getMark).average().getAsDouble()),

                    new Average("m", e.getValue().stream().filter(student -> student.getGender().equals("m"))
                            .mapToInt(Student::getMark).average().getAsDouble()))

    ));

它会为您提供一个包含班级名称的地图,以及每个性别的平均分数列表。

map.forEach((s, averages) -> {
        System.out.print("class: " + s + " ");
        averages.forEach(average ->
                System.out.print(average.getGender() + " " + average.getAverage() + " ")
        );
        System.out.println();
    });
    // class: 1 f 17.5 m 10.0 
    // class: 2 f 10.0 m 13.5 

正如我所说的这段代码仅用于演示目的,它需要一些改进。请谨慎使用。