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()方法,而所有的默认方法都是输出其对象名和地址。

posted @ 2017-10-16 01:39  寒来袖间  阅读(217)  评论(0编辑  收藏  举报