Java 自然排序与比较器排序

Java 自然排序与比较器排序,第1张

自然排序与比较器排序 自然排序(Comparable) java.lang.Comparable;

Comparable是一个抽象类,需要类实现它,才可以使用自然排序。 Comparable 同时是泛型,需要实现它的public int compareTo()方法.

以TreeSet举例,TreeSet有两种使用排序的方法,一种是类型自带自然排序接口Comparable,如:Integer,String等,都是实现了Comparable接口,所以可以直接添加对象进TreeSet中,TreeSet通过他们本身自带的compareTo()接口实现Set的有序排序;

        //TreeSet的无参构造方法,使用了其包含的类中的Comparable接口实现排序
        TreeSet ts = new TreeSet();
        /**
         * class Student implements Comparable{
         *     private int age;
         *
         *     @Override
         *     public int compareTo(Student s) {
         *         return 0;
         *     }
         * }
         * */
        //Student类中本身没有实现Comparable接口,我们可以自定义Comparable接口,实现我们想要的排序规则。

TreeSet中使用自然排序,会将当前对象和上一个对象进行比较。

    @Override
    public int compareTo(Student s) {
        //当前对象和上一个对象
        //当前对象的年龄减去上一个对象的年龄
        int num = this.age - s.age;
        //如果结果是一个整数,那么代表当前年龄大于上一个年龄,返回正数,这时候就会将当前对象添加到TreeSet中
        //因为是整数,TreeSet就默认添加到上一个元素的后面,也就是直接插入
        //这样判断就构成了升序的排序
        //如果返回的是一个负数,那么代表当前对象小于上一个对象,就会将当前对象插入到上一个对象之前,以此来保证升序
        return num;
    }

如果要使TreeSet完成降序的 *** 作(从高到底):

    @Override
    public int compareTo(Student s) {
        //当前对象和上一个对象
        //上一个对象减去当前对象,如果是整数,那么代表上一个对象大于当前对象
        int num = s.age - this.age;
        //这时候是整数,那么就会将当前的元素添加到上一个元素之后,就完成了降序的排序(从高到低)
        //如果得到的是一个负数,那么就代表上一个元素小于当前元素,所以就会将当前元素添加到上一个元素之前,以此来保证有序
        return num;
    }

如果得到的结果是0呢?那么TreeSet就认为比较的两个是相同的对象,就不会进行添加 *** 作。

总结:自然排序接口就是通过类来实现排序接口,使得类在需要排序的地方可以直接使用类的排序方法进行排序,但这种排序方式是固定的,也就是这个类只能使用该排序方法进行排序,如果想要不同方法来对这个类进行排序就无法实现。

比较器排序(Compareator) java.util.Comparator

Comparator比较器排序,它的好处就是将类和自然排序进行了分离,在要使用到排序的时候,在创建对象的时候给它提供一个比较器即可。

以TreeSet举例,通过匿名内部类的方法创建比较器:

        //TreeSet的有参构造方法,通过提供比较器排序来实现TreeSet的排序,这样TreeSet的实现类就无需实现自然排序接口
        TreeSet ts = new TreeSet(new Comparator() {
            //以匿名内部类方式在创建TreeSet对象的时候提供比较器
            @Override
            public int compare(Student s1, Student s2) {
                //s1就是当前的对象,s2就是TreeSet中的上一个对象
                //还是拿当前对象和上一个对象进行比较
                int num = s1.getAge() - s2.getAge();
                //当前对象的年龄减去上一个对象的年龄
                //如果是正数,那么代表当前对象大于上一个对象,
                //就会将当前对象添加到上一个对象之后,也就是直接插入到TreeSet的末尾
                return num;
            }
        });

比较器使用的升序排序(从低到高),如果想要使用降序,那么上一个对象的具体值减去当前对象的具体值即可完成降序排序,如:

        //TreeSet的有参构造方法,通过提供比较器排序来实现TreeSet的排序,这样TreeSet的实现类就无需实现自然排序接口
        TreeSet ts = new TreeSet(new Comparator() {
            //以匿名内部类方式在创建TreeSet对象的时候提供比较器
            @Override
            public int compare(Student s1, Student s2) {
                //s1就是当前的对象,s2就是TreeSet中的上一个对象
                //还是上一个对象和当前对象进行比较
                int num = s2.getAge() - s1.getAge();
                //当前上一个对象的年龄减去当前对象的年龄
                //如果是正数,那么代表上一个对象大于当前对象
                //就会将当前对象添加到上一个对象之后,也就是直接插入到TreeSet的末尾
                //这样就实现了降序的排序
                return num;
            }
        });

同自然排序一样,如果返回的是0,那么TreeSet就认为是相同元素,就不进行添加,这就是TreeSet能实现排序和去重的要点。

总结:比较器排序不需要类实现自然排序接口,可以通过提供比较器的方法提供比较规则,无需该类实现自然接口,也就是该类可以使用比较器来实现多种比较排序,可以使用多种排序规则进行该类的排序。也就是Comparator将比较排序算法与具体的类分离开了,这样避免了一个类只能使用一种比较排序的算法

参考资料:[Java中的排序比较方式:自然排序和比较器排序]((6条消息) Java中的排序比较方式:自然排序和比较器排序_littledownload的博客-CSDN博客)

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/724485.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-04-26
下一篇2022-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存