自然排序Comparable接口和比较器排序comparator接口使用的详细介绍+案例说明

自然排序Comparable接口和比较器排序comparator接口使用的详细介绍+案例说明

  • 自然排序Comparable:
    • 案例需求
    • 实现步骤
    • 代码实现:
  • 比较器排序Comparator
    • 案例需求
    • 实现步骤:
    • 代码实现

自然排序Comparable:

  • 就是让元素所属的类实现Comparable接口、重写comparaTo(T o)方法

  • 该方法返回值是int类型,如果返回值为正数,则表示当前对象(调用该方法的对象)比o(该方法传入的对象)对象,反之,返回值为0,则比较对象相等

  • 重写时,一定要注意排序规则必须按照要求的主要条件和次要条件来写

案例需求

存储学生对象并遍历,创建TreeSet集合使用无参构造方法

要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序

实现步骤

  • 用TreeSet集合存储自定义对象,无参构造方法使用的是自然排序对元素进行排序的

  • 自然排序,就是让元素所属的类实现Comparable接口,重写compareTo(T o)方法

  • 重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写

代码实现:

学生类:

    public class Student implements Comparable<Student> {
        private String name;
        private int age;
        public Student() {
        }
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    	}
    public String getName() {
    	return name;
    	}
    public void setName(String name) {
    	this.name = name;
    	}
    public int getAge() {
    	return age;
    	}
    public void setAge(int age) {
    	this.age = age;
    	}
    @Override
    public int compareTo(Student s) {
        // return 0;	相等
        // return 1;	升序
        // return -1;	降序
        //按照年龄从小到大排序
        int num = this.age - s.age;
        // int num = s.age - this.age;
        //年龄相同时,按照姓名的字母顺序排序
        int num2 = num==0?this.name.compareTo(s.name):num;
        return num2;
    	}
    }

测试类

public class TreeSetDemo02 {
    public static void main(String[] args) {
    //创建集合对象
    TreeSet<Student> ts = new TreeSet<Student>();
        //创建学生对象
        Student s1 = new Student("小明", 19);
        Student s2 = new Student("大红", 48);
        Student s3 = new Student("亮亮", 20);
        Student s4 = new Student("赫赫", 73);
        Student s5 = new Student("有心",33);
        Student s6 = new Student("力量",33);
        //把学生添加到集合
        ts.add(s1);
        ts.add(s2);
        ts.add(s3);
        ts.add(s4);
        ts.add(s5);
        ts.add(s6);
        //遍历集合
        for (Student s : ts) {
            System.out.println(s.getName() + "," + s.getAge());
            }
        }
}  

比较器排序Comparator

  • 比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(T o1,To2)方法

  • Comparator接口中有定义了两个方法:compare(Object o1,Object o2)和equals方法,由于equals方法所有对象都有的方法,因此我们实现Comparator接口时,只需要重写compare方法,不需要重写equals方法。

  • 该方法返回值是int类型,如果返回值为正数升序,反之降序,返回值为0,则比较对象相等

案例需求

存储学生对象并遍历,创建TreeSet集合使用带参构造方法

要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序

实现步骤:

  • 用TreeSet集合存储自定义对象,带参构造方法使用的是比较器排序对元素进行排序的

  • 比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(T o1,T o2)方法

  • 重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写

代码实现

学生类

public class Student {
    private String name;
    private int age;
    public Student() {
    }
    public Student(String name, int age) {
    this.name = name;
    this.age = age;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
        }
    public int getAge() {
    return age;
    }
    public void setAge(int age) {
    this.age = age;
    }
}

实现类

public class TreeSetDemo {
    public static void main(String[] args) {
        //创建集合对象
        TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                //this.age - s.age
                //s1,s2
                int num = s1.getAge() - s2.getAge();
                int num2 = num == 0 ? s1.getName().compareTo(s2.getName()): num;
                return num2;
            }
        });
        	//创建学生对象
            Student s1 = new Student("xishi", 29);
            Student s2 = new Student("wangzhaojun", 28);
            Student s3 = new Student("diaochan", 30);
            Student s4 = new Student("yangyuhuan", 33);
            Student s5 = new Student("linqingxia",33);
            Student s6 = new Student("linqingxia",33);
            //把学生添加到集合
            ts.add(s1);
            ts.add(s2);
            ts.add(s3);
            ts.add(s4);
            ts.add(s5);
            ts.add(s6);
            //遍历集合
            for (Student s : ts) {
                System.out.println(s.getName() + "," + s.getAge());
            }
    }
}

你可能感兴趣的:(JavaLearn,java,排序,集合)