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),然后您将仅获得不同的值。如果不同值的数量与原始列表的大小不同,则列表中存在重复项。