Comparator.comparing 中的多项检查
Multiple checks in Comparator.comparing
我有一个对象列表,'Students' - 每个 'Student' 存储姓名和学号。
我想按 ID 的升序对列表进行排序,并确保没有两个学生具有相同的 ID 号。
如果有多个学生有相同的ID,抛出异常,否则做一些事情。
对于排序部分,我使用的是比较器 -
students.sort((Comparator.comparing(Student::getStudentID).reversed()));
对于第二部分,我可以添加另一个 for 循环,遍历学生并进行检查。
我想避免第二个循环并在我自己排序时检查多个 ID。有没有有效的方法来做到这一点?
[抱歉,如果问题太基础,我正在尝试寻找更有效的编码方式]
您可以编写自己的 Comparator
- 即:
class StudentsComparator implements Comparator<Student> {
@Override
public int compare(Student student1, Student student2) {
if (student1.getStudentId().equals(student2.getStudentId())) {
throw new IllegalStateException("Same ids");
}
return student2.getStudentId().compareTo(student1.getStudentId());
}
}
那么你可以这样做:
students.sort(new StudentsComparator());
以获得正确的结果。
但是,先搜索重复项然后在另一遍中排序可能是一个 cleaner
解决方案,将两个不同的要求相互分离。除非你真的很关心性能,否则运行 2 次是更好的选择 - 它是一个更干净的代码。
更新
至于查找重复项,您可以从不同的方向进行。一个是:
private boolean hasDuplicates(List<Student> students) {
return students.size() != students.stream().map(Student::getStudentId).distinct().count();
}
在这里,对于每个学生,您将获得他的 ID(在 map
方法中,您将学生替换为他的 ID),然后您将仅获得不同的值。如果不同值的数量与原始列表的大小不同,则列表中存在重复项。
我有一个对象列表,'Students' - 每个 'Student' 存储姓名和学号。 我想按 ID 的升序对列表进行排序,并确保没有两个学生具有相同的 ID 号。 如果有多个学生有相同的ID,抛出异常,否则做一些事情。
对于排序部分,我使用的是比较器 -
students.sort((Comparator.comparing(Student::getStudentID).reversed()));
对于第二部分,我可以添加另一个 for 循环,遍历学生并进行检查。
我想避免第二个循环并在我自己排序时检查多个 ID。有没有有效的方法来做到这一点?
[抱歉,如果问题太基础,我正在尝试寻找更有效的编码方式]
您可以编写自己的 Comparator
- 即:
class StudentsComparator implements Comparator<Student> {
@Override
public int compare(Student student1, Student student2) {
if (student1.getStudentId().equals(student2.getStudentId())) {
throw new IllegalStateException("Same ids");
}
return student2.getStudentId().compareTo(student1.getStudentId());
}
}
那么你可以这样做:
students.sort(new StudentsComparator());
以获得正确的结果。
但是,先搜索重复项然后在另一遍中排序可能是一个 cleaner
解决方案,将两个不同的要求相互分离。除非你真的很关心性能,否则运行 2 次是更好的选择 - 它是一个更干净的代码。
更新
至于查找重复项,您可以从不同的方向进行。一个是:
private boolean hasDuplicates(List<Student> students) {
return students.size() != students.stream().map(Student::getStudentId).distinct().count();
}
在这里,对于每个学生,您将获得他的 ID(在 map
方法中,您将学生替换为他的 ID),然后您将仅获得不同的值。如果不同值的数量与原始列表的大小不同,则列表中存在重复项。