Как получить максимальный элемент из Arraylist? - PullRequest
1 голос
/ 14 июля 2020

Пожалуйста, помогите мне! Мне нужно получить максимальную среднюю оценку. Как мы можем взять элемент из Arraylist и сравнить его с другим элементом?

import java.util.ArrayList;

class Student {

  String name;
  double averageGrade;

  public Student(String name, double averageGrade) {
    this.name = name;
    this.averageGrade = averageGrade;
  }
}

public class exam2014_07 {

  public static void main(String[] args) {
    double max = 0;
    Student s1 = new Student("Georgi", 5.50);
    Student s2 = new Student("Ivan", 5.70);
    Student s3 = new Student("Maria", 5.80);

    ArrayList<Student> student = new ArrayList<Student>();
    student.add(s1);
    student.add(s2);
    student.add(s3);

    for (Student s : student) {
      //i need the max grade  
        if (max > s.averageGrade) {
            max = s.averageGrade;
            System.out.println("Name: " + s.name + "average grade: " + s.averageGrade);
        }   
    }
  }
}

Ответы [ 3 ]

1 голос
/ 14 июля 2020

Поскольку для max установлено значение 0, а затем max > s.averageGrade, результаты не будут получены, поскольку 0 всегда меньше среднего. Если вы перевернете больше чем на меньше чем; то способ, которым ваш for l oop работает, распечатает все ответы, так как каждое среднее значение выше, чем ранее вставленное значение.

Вы можете сделать что-то вроде этого, используя java потоки, чтобы найти максимальное значение:

Student s = student.stream().max((m1, m2) -> m1.averageGrade.compareTo(m2.averageGrade)).orElse(null);
if (s != null)
  System.out.println("Name: " + s.name + "average grade: " + s.averageGrade);

и измените averageGrade с примитивного double на Double, чтобы мы могли воспользоваться compareTo

UPDATE

Чтобы воспользоваться преимуществом java 8 и сделать поток более оптимизированным, мы можем сделать следующее:

Обновите свой класс ученика с помощью publi c getters

class Student {

  private String name;
  private Double averageGrade;

  public Student(String name, double averageGrade) {
    this.name = name;
    this.averageGrade = averageGrade;
  }
  
  public String getName() {
    return this.name;
  }
  
  public Double getAverageGrade() {
    return this.averageGrade;
  }
}

Тогда мы сможем измените код, чтобы найти максимальное среднее значение:

Optional<Student> student = students.stream()
                  .max(Comparator.comparingDouble(Student::getAverageGrade));
    
if (student.isPresent()) {
  Student s = student.get();
  System.out.println("Name: " + s.getName() + "average grade: " + s.getAverageGrade());
}
1 голос
/ 14 июля 2020

Вы можете использовать Stream API , получить от объекта Student значение averageGrade и получить максимальное значение в OptionalDouble

OptionalDouble maxOptionalDouble = student.stream().mapToDouble(stud -> stud.averageGrade).max();
if (maxOptionalDouble.isPresent()) {
    System.out.println(maxOptionalDouble.getAsDouble());
}

, или отсортируйте студентов в порядке убывания averageGrade и получите первого

Comparator<Student> cmp = (stud1, stud2) -> Double.valueOf(stud2.averageGrade)
                .compareTo(Double.valueOf(stud1.averageGrade));
student.sort(cmp);
Student std = student.get(0);
System.out.println("Name: " + std.name + "average grade: " + std.averageGrade);
1 голос
/ 14 июля 2020

Вы должны проверить, не превышает ли оценка текущего ученика предыдущий максимум, и печатать в конце l oop только после того, как вы проверили оценки всех учеников.

Student best = null;
for (Student s : student) {
  if (max < s.averageGrade) {
      max = s.averageGrade;
      best = s;
  }   
}
System.out.println("Name: " + best.name + "average grade: " + best.averageGrade);
...