java - 按特定条件在列表中查找对象
问题描述
我有一个清单,必须在那里找到特定的对象。我必须按学生的平均标记值对列表进行排序,并创建搜索具有第二高值的学生的函数。如果它与其他学生重复,则函数将返回较年轻的学生。此任务的另一个要求(要正确解决)是我无法创建任何对象。下面我留下了我正在使用的类的代码:
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 循环解决它,但是这个解决方案与任务条件不匹配(需要创建对象)
解决方案
实施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);
}
}
推荐阅读
- reactjs - TypeScript 和自定义 React Hook Api 服务
- python - 如何在 Django 中编辑多对多关系(管理站点)
- html - 如何格式化facebook返回的字符串
- python - Python 别名
- intellij-idea - IDEA用的是JRebel Debug,很混乱
- javascript - Chrome 中的 JQuery-find-each:未捕获 RangeError:超出最大调用堆栈大小
- orocommerce - 在 ORO Commerce 的地址下拉列表中添加新州
- macos - eslint 没有在 VS 代码中运行
- python - cx_Freeze EXE 应用程序在其他计算机上不起作用
- sql - 减去按资产类型分组的两个总和?