【问题标题】:Find the average of 2 elements in Arrays.asList using Java stream()使用 Java stream() 查找 Arrays.asList 中 2 个元素的平均值
【发布时间】:2021-05-15 12:11:46
【问题描述】:

我很难在 Arrays.asList 中找到两个整数之间的平均值,包括不同的数据类型(字符串和整数)。在这种情况下可以使用流吗?

public class Student {
    String name;
    String faculty;
    private final int groupNumber;
    private final int commonSubjectGrade;
    private final int specialSubjectGrade;

    public Student(String name, String faculty, int groupNumber, int commonSubjectGrade, int specialSubjectGrade){
    this.name = name;
    this.faculty = faculty;
    this.groupNumber = groupNumber;
    this.commonSubjectGrade = commonSubjectGrade;
    this.specialSubjectGrade = specialSubjectGrade;
}

public String getName() {
        return name;
    }
          
    public int getCommonSubjectGrade() {
        return commonSubjectGrade;
    }

    public int getSpecialSubjectGrade() {
        return specialSubjectGrade;
    }
}

我需要找到最后两个整数(commonSubjectGrade 和 specialSubjectGrade)之间的平均值。

import java.util.*;
public class Main {
static List<Student> students = Arrays.asList(
        new Student("Podrick Payne", "IntrigueFaculty",1, 7, 8),
        new Student("Margaery Tyrell", "IntrigueFaculty", 1, 4, 9),
        new Student("Sandor Clegane", "IntrigueFaculty", 1, 8, 8),
        new Student("Eddard Stark", "IntrigueFaculty",1, 9, 6),
        new Student("Petyr Baelish", "IntrigueFaculty",1, 5, 8)
);

public static void main(String[] args) {
        double averageGradeForCommonSubject = students.stream().mapToDouble(Student::getCommonSubjectGrade).average().getAsDouble();
        System.out.println("Average grade in common subject for the entire university = " + averageGradeForCommonSubject);
}

第一部分(在所有学生中找到共同学科的平均分)效果很好,但下一部分效果不佳:(

double averageGradeOfTheCertainStudent = students.stream().filter((student) -> student.getName().equals("Petyr Baelish")).
                mapToDouble(student -> student.getSpecialSubjectGrade() & student.getCommonSubjectGrade()).average().getAsDouble();
System.out.println("Average grade of Petyr Baelish = " + averageGradeOfTheCertainStudent);

计算 Petyr Baelish 的最后 2 个整数(8 到 5 之间)的平均值的方法是什么? 我会很感激任何帮助。如果我的问题很愚蠢,请不要笑我。我学习 Java 才 3 周 :)

【问题讨论】:

    标签: java arraylist java-stream


    【解决方案1】:

    你很亲密!

    您正在寻找flatMap

    我们可以flatMap一个学生到2个成绩的流,然后得到流的平均值。

    另外,如上所述,最好映射到Integer(因为成绩是int)。

    double averageGradeOfTheCertainStudent = students.stream()
            .filter(student -> student.getName().equals("Petyr Baelish"))
            .flatMapToInt(student -> IntStream.of(student.getSpecialSubjectGrade(), student.getCommonSubjectGrade()))
            .average()
            .getAsDouble();
    

    输出:

    Average grade of Petyr Baelish = 6.5
    

    【讨论】:

    • @Shubt 我认为这会有所帮助 - meta.stackexchange.com/questions/86978/…
    • 在我的问题之后,如果getSpecialSubjectGrade() 方法在Student 类中(作为超类)并且.getCommonSubjectGrade() 方法在学生的子类中,我如何才能找到相同的平均值?如何使用.flatMapToInt(或其他任何方法)达到这个子类方法?我不得不添加子类并覆盖一个方法,你建议的解决方案被打破了:(提前谢谢你!
    • @Shubt 我不明白。你有一个超类的列表吗?
    • 一开始我只有一个类Student,有两个类字段int commonSubjectGradeint specialSubjectGrade(和getter)。我试图找到它们之间的平均值。然后我创建了子类StudentOfTheGroup extends Student 将字段int specialSubjectGrade 从类Student 删除到子类StudentOfTheGroup。现在平均值的计算不起作用,因为.flatMapToInt 现在只能使用类Student (getCommonSubjectGrade()) 的getter。我无法联系到第二个吸气剂 (getSpecialSubjectGrade())。
    • 没错。列表保持不变。但是列表中的对象来自不同的类(超类和子类)
    【解决方案2】:

    您已使用&amp; 来求平均值。该运算符用于按位与运算。

    求必填字段的总和,然后除以 2 求平均值。

    double avg = students.stream()
                         .filter(student -> student.getName().equals("Petyr Baelish"))
                         .mapToDouble(student -> student.getSpecialSubjectGrade() + student.getCommonSubjectGrade())
                         .map(i -> i/2)
                         .findFirst()
                         .orElse(0d);
    System.out.println("Average grade of Petyr Baelish = " + avg);
    
    

    【讨论】:

      猜你喜欢
      • 2014-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-28
      • 2014-03-31
      • 2013-07-22
      • 2022-11-17
      相关资源
      最近更新 更多