按多个字段对对象列表进行排序

2022-09-01 00:46:12

我有一个Java对象列表,我想根据多个字段进行排序。

public class graduationCeremony {
    String campus;
    String faculty;
    String building;
}

是否可以使用 a 或接口根据多个字段对列表进行排序?我看到的所有示例仅根据一个字段进行排序。换句话说,可以按“校园”或“教师”或“建筑”进行排序。我想按“校园”排序,然后是“教师”,然后是“建筑”(因为它存在于SQL中:ComparatorComparableORDER BY campus, faculty, building)

我想这个问题以前问过,但我不明白公认的答案。有人可以扩展或说明这个答案吗?


答案 1

您的比较器将如下所示:

public class GraduationCeremonyComparator implements Comparator<GraduationCeremony> {
    public int compare(GraduationCeremony o1, GraduationCeremony o2) {
        int value1 = o1.campus.compareTo(o2.campus);
        if (value1 == 0) {
            int value2 = o1.faculty.compareTo(o2.faculty);
            if (value2 == 0) {
                return o1.building.compareTo(o2.building);
            } else {
                return value2;
            }
        }
        return value1;
    }
}

基本上,只要到目前为止比较的属性相等,它就会继续比较类的每个连续属性()。== 0


答案 2

是的,你绝对可以做到这一点。例如:

public class PersonComparator implements Comparator<Person>
{
    public int compare(Person p1, Person p2)
    {
        // Assume no nulls, and simple ordinal comparisons

        // First by campus - stop if this gives a result.
        int campusResult = p1.getCampus().compareTo(p2.getCampus());
        if (campusResult != 0)
        {
            return campusResult;
        }

        // Next by faculty
        int facultyResult = p1.getFaculty().compareTo(p2.getFaculty());
        if (facultyResult != 0)
        {
            return facultyResult;
        }

        // Finally by building
        return p1.getBuilding().compareTo(p2.getBuilding());
    }
}

基本上你是在说,“如果我只要看看校园就能分辨出哪一个先来(在他们来自不同的校园之前,校园是最重要的领域),那么我就会返回这个结果。否则,我将继续比较能力。同样,如果这足以区分它们,请停止。否则,(如果校园和教师对两个人来说都是一样的)只需使用按建筑比较它们的结果。


推荐