首页 > 解决方案 > 按特定条件在列表中查找对象

问题描述

我有一个清单,必须在那里找到特定的对象。我必须按学生的平均标记值对列表进行排序,并创建搜索具有第二高值的学生的函数。如果它与其他学生重复,则函数将返回较年轻的学生。此任务的另一个要求(要正确解决)是我无法创建任何对象。下面我留下了我正在使用的类的代码:

import java.time.LocalDate;
import java.util.Comparator;
import java.util.List;

public class Student implements Comparator<Student>{
private String firstName;
private String lastName;
private LocalDate dateOfBirth;
private double averageMark;

public double getAverageMark() {
    return averageMark;
}

   
//function below must find student that I described upper. Currently 
//function is incomplete because I still try to find correct solution 
public static Student findSecondBestStudent(List<Student> students) {


    return students.stream().sorted(Comparator.reverseOrder());
}

@Override
public int compare(Student o1, Student o2) {
    return (int) (o1.getAverageMark() - o2.getAverageMark());
}
}

现在我确实尝试通过对流进行反向排序来解决这个问题,然后删除流的第一个值并比较流的两个下一个对象并返回正确的对象。我可以使用 for 循环解决它,但是这个解决方案与任务条件不匹配(需要创建对象)

标签: javasortingcollectionsstream

解决方案


实施Comparable而不是Comparator.

制作您的compareTo函数,以便按所需顺序对学生进行排序(反向)

对您的 进行排序stream,跳过 1 个条目,返回下一个条目。

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

public class Student implements Comparable<Student> {
  private String firstName;
  private String lastName;
  private LocalDate dateOfBirth;
  private double averageMark;
  
  public Student(String firstName, String lastName, LocalDate dateOfBirth, double averageMark) {
    super();
    this.firstName = firstName;
    this.lastName = lastName;
    this.dateOfBirth = dateOfBirth;
    this.averageMark = averageMark;
  }

  public double getAverageMark() {
    return averageMark;
  }

  //function below must find student that I described upper. Currently 
  //function is incomplete because I still try to find correct solution 
  public static Student findSecondBestStudent(List<Student> students) {
    return students.stream().sorted().skip(1).findFirst().orElse(null);
  }

  @Override
  public int compareTo(Student other) {
    if (other == null)
      return 1;
    if (other.averageMark == averageMark) {
      if (other.dateOfBirth == null)
        return -1;
      return other.dateOfBirth.compareTo(dateOfBirth);
    }
    return Double.compare(other.averageMark, averageMark);
  }

  @Override
  public String toString() {
    return "Student [firstName=" + firstName + ", lastName=" + lastName + ", dateOfBirth=" + dateOfBirth
        + ", averageMark=" + averageMark + "]";
  }
  
  public static void main(String[] args) {
    final List<Student> students = new ArrayList<>(6);
    students.add(new Student("Peter", "Tibbitts", LocalDate.of(2001, 4, 6), 5));
    students.add(new Student("Leon", "Gaston", LocalDate.of(1951, 6, 17), 12));
    students.add(new Student("Eric", "Carter", LocalDate.of(1945, 12, 24), 9));
    students.add(new Student("Richard", "Heard", LocalDate.of(1984, 5, 9), 4));
    students.add(new Student("Frankie", "Bonner", LocalDate.of(1970, 4, 19), 10));
    students.add(new Student("Donald", "Pascal", LocalDate.of(2000, 3, 26), 10));
    
    final Student result = Student.findSecondBestStudent(students);
    System.out.println(result);
  }
  
}

推荐阅读