案例:成绩排序(使用比较器comparator接口)

 

 

首先根据思路编写代码,然后根据要求分析排序的主要条件和次要条件(分析思路在文末),在学生类中有三个成员变量,姓名(name),语文成绩(chinese),数学成绩(math),要求按照总分排序,在本需求中仅需要两科成绩,如果需要多门成绩时多次调用get方法就比较麻烦,可以在学生类中提供一个公开的获取总分的方法,getSum:

//提供获取总分的方法
public int getSum() {
        int sum = this.chinese + this.math;
    }

 

 操作类代码实现:

public class TreeSetDemo {
    public static void main(String[] args) {
        //创建集合对象
        TreeSet<Student> treeSet = new TreeSet<Student>(new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                //主要条件:按照总分由高到低
                int num = s2.getSum() - s1.getSum();
                return num;
            }
        });

        //创建学生对象
        Student s1 = new Student("托马斯",99,98);
        Student s2 = new Student("旭旭宝宝",100,99);
        Student s3 = new Student("大坤坤",95,97);
        Student s4 = new Student("王欣",97,98);
        Student s5 = new Student("高的伟",98,97);

        //添加元素到集合
        treeSet.add(s1);
        treeSet.add(s2);
        treeSet.add(s3);
        treeSet.add(s4);
        treeSet.add(s5);

        //遍历集合
        for (Student s : treeSet){
            System.out.println(s.getName()+","+s.getChinese()+","+s.getMath()+","+s.getSum());
        }

    }
}

输出结果:

 

通过运行结果可以发现,学生对象s5并没有添加进去,原因在于:s4和s5的总分相同,排序器认为二者是相同的元素,所以没有被添加,显然这是不完善的代码,排序条件不够完善。

接下来分析排序条件:

1.在总分不同时,按总分降序排序

2.在总分相同时,比较单科成绩,按单科成绩自然排序 此时排序条件为:int num2 = num == 0 ? s1.getChinese() - s2.getChinese() : num;

3.当总分相同,各单科成绩也相同时,比较名字是否相同,名字不同时按自然顺序排序 此时排序条件为 int num3 = num2 == 0 ? s1.getName().compareTo(s2.getName()) : num2;

根据分析完善代码:

TreeSet<Student> treeSet = new TreeSet<Student>(new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                //主要条件:按照总分由高到低
                int num = s2.getSum() - s1.getSum();
                int num2 = num == 0 ? s1.getChinese() - s2.getChinese() : num;
                int num3 = num2 == 0 ? s1.getName().compareTo(s2.getName()) : num2;
                return num3;
            }
        });

运行结果:

 

posted @ 2020-04-09 11:38  硬盘红了  阅读(288)  评论(0编辑  收藏  举报