• 2016-08-26-Java比较器的使用


    Java比较器的使用

    在编程中我们常常需要对对象进行排序,而排序又必须根据对象的实际类型进行比较。Java中提供了两个比较器接口用于对象之间的比较,分别是java.lang包中的Comparable接口和java.util包中Comparator接口。下面分别对这两种使用方法进行简单介绍。
    第一种java.lang.Comparable接口,只需要实现compareTo()一个方法就可以实现比较功能,并且调用系统排序函数查看效果。代码如下:

    import java.util.Arrays;
    
    public class Children implements Comparable<Children>{
        private String name;
        private int age;
        public Children(String name,int age){
            this.name=name;
            this.age=age;
        }
        public String toString(){//重载toString()方法
            return name+"******"+age;
        }
        @Override
        public int compareTo(Children c) {
            if(this.age>=c.age)
                return 1;
            else
                return -1;
        }
        public static void main(String []args){
            Children[] childrens={new Children("Helen",8),
                                  new Children("David",12),
                                  new Children("Andrew",10),
                                  new Children("Angela",7),
                                  new Children("Joe",9)};
            Arrays.sort(childrens);
            for(Children ch: childrens){
                System.out.println(ch);
            }
        }
    }
    /* 输出结果
    *Angela******7
    *Helen******8
    *Joe******9
    *Andrew******10
    *David******12
    */
    

    采用这种方法,我们需要让比较的对象类实现这个接口,并且必须要重载int compareTo(Object o)方法,接受一个需要比较的同类型的对象,如果该对象小于参数返回负值,除此之外返回正值,这时排序以增序排列,反之则以降序排列。
    第二种import java.util.Comparator接口,该接口有多个方法,但是如果是完成最简单的比较和排序的话,仅仅实现int compare(T o1, T o2)方法即可。代码如下:

    import java.util.Arrays;
    import java.util.Comparator;
    
    public class Student {
        private String name;
        private int age;
        public Student(String name,int age){
            this.name=name;
            this.age=age;
        }
        public String getName(){
            return name;
        }
        public int getAge(){
            return age;
        }
        public String toString(){
            return name+"******"+age;
        }
        public static class CompareStudents implements Comparator<Student>{
            @Override
            public int compare(Student o1, Student o2) {
                if (o1.getAge()>=o2.getAge())
                    return 1;
                else
                    return -1;
            }
        }
        public static void main(String []args){
            Student[] students={new Student("Helen",8),
                    new Student("David",12),
                    new Student("Andrew",10),
                    new Student("Angela",7),
                    new Student("Joe",9)};
            Arrays.sort(students,new CompareStudents());
            for(Student stu: students){
                System.out.println(stu);
            }
        }
    }
    /* 输出结果
    *Angela******7
    *Helen******8
    *Joe******9
    *Andrew******10
    *David******12
    */
    

    用这种方法,需要为比较的对象单独创建一个实现了Comparator接口的类,可以发现int compare(T o1, T o2)需要传入两个参数并且排序比较的规则与之前也是类似的。两种方法最后得到了完全一样的结果,但是Comparator接口还有很多其他方法,尤其是JDK1.8之后才添加的新的方法,所以会有更强大的功能。所以如果是仅仅实现基本的对象比较的话采用第一种就可以了,但是如果有更多需求的话,则需要采用第二种方法。
    Tips:至于为什么需要重写toString()方法,是因为在System.out.println()中输出的如果是对象,则会默认调用其toString()方法,而所有的默认方法都是输出其对象名和地址。

  • 相关阅读:
    P4630-[APIO2018]Duathlon铁人两项【圆方树】
    P4980-[模板]Pólya定理
    bzoj4589-Hard Nim【FWT】
    CF700E-Cool Slogans【SAM,线段树合并,dp】
    sqrt数据结构
    NOIP历年好题
    ACM题解吖
    [ZJOI2010]排列计数
    [CQOI2014]数三角形
    [SHOI2007]书柜的尺寸
  • 原文地址:https://www.cnblogs.com/abel-huang/p/7675260.html
Copyright © 2020-2023  润新知