解析java中Comparable和Comparator两种比较器

        最近遇到Comparator和Comparable两种比较器,老是弄混,所以这里做个笔记记录一下。

       Comparable据说称为内部比较器,Comparator称为外部比较器,为什么这么说呢?我的理解是,Comparator可以脱离所需比较的类,在另一个类中去实现,有点绕,接下来在代码中回演示,细细体会即可理解。他们可以对类进行比较,其实说白了,实际上也就是根据类中的某个字段来比较这两个类的大小。说是比较,其实更多的是排序,利用Collections.sort()Arrays.sort()这两个工具类进行排序。

        先看Coparable这个比较器:在java.lang这个包里面。只用一个compareTo(T o)方法:

解析java中Comparable和Comparator两种比较器_第1张图片

 解析java中Comparable和Comparator两种比较器_第2张图片

 他比较的是当前对象和传入的对象大小,如果当前对象大于,等于,小于传入的对象,则返回1,0,-1值;

================================================================================================

再看看Comparator这个比较器:他是在java.util包里面;里面的方法比较多,但是我们只关心compare(T o1,T o2)这个方法。

解析java中Comparable和Comparator两种比较器_第3张图片

解析java中Comparable和Comparator两种比较器_第4张图片 

     这个方法比较参数是两个相同类型的对象,并比较其大小,如果o1大于,等于,小于o2对象,则返回1,0,-1值;

 ================================================================================================

        着了用代码测试一下,先定义一个类吧:

package com.Jevin.compare.demo1;

public class Person{

    private String name;
    private int age;

    public Person(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;
    }

}

这里先用Comparable先测试:

package com.Jevin.compare.demo1;

import java.util.Arrays;

public class Person implements Comparable{

    private String name;
    private int age;

    public Person(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(Person p) {
        return p.getAge() - this.age;
    }

    public static void main(String[] args) {
        Person[] people = new Person[] {new Person("Jevin1", 11), new Person("Jevin2", 5), new Person("Jevin1", 27)};
        System.out.println("========排序前========");
        for (Person person : people) {
            System.out.print(person.getName() + ":" + person.getAge() + "  ");
        }
        System.out.println();
        Arrays.sort(people);
        System.out.println("=====排序后=====");
        for (Person person : people) {
            System.out.print(person.getName() + ":" + person.getAge() + "  ");
        }
    }
}

测试结果如下:

解析java中Comparable和Comparator两种比较器_第5张图片

这里我们用的是Arrays.sort()测试的,用Collections.sort()测试也可以的,如下:

解析java中Comparable和Comparator两种比较器_第6张图片

并且我们注意到结果是降序的,原因在这里:

 解析java中Comparable和Comparator两种比较器_第7张图片

如果这么写的话,就升序了:

 解析java中Comparable和Comparator两种比较器_第8张图片

 ================================================================================================以上是Comparable比较器,下面介绍Comparator比较器:

上面的第一个Person类不要动,保留着,添加一个以下这个比较器:

package com.Jevin.compare.demo1;

import java.util.Arrays;
import java.util.Comparator;

public class PersonComparator implements Comparator {

    @Override
    public int compare(Person p1, Person p2) {
        return p1.getAge() - p2.getAge();
    }

    public static void main(String[] args){
        Person[] people = new Person[]{new Person("Jevin1",11),new Person("Jevin2",5),new Person("Jevin1",27)};
        System.out.println("========排序前========");
        for(Person person:people){
            System.out.print(person.getName()+":"+person.getAge()+"  ");
        }
        System.out.println();
        Arrays.sort(people,new PersonComparator());
        System.out.println("=====排序后=====");
        for(Person person:people){
            System.out.print(person.getName()+":"+person.getAge()+"  ");
        }
    }
}

运行结果如下:
解析java中Comparable和Comparator两种比较器_第9张图片

这里和Comparable的区别看这里:

解析java中Comparable和Comparator两种比较器_第10张图片

这里排序时将排序规则的对象加了进去,结果是升序,想要降序很简单,改一下compare()方法题即可:

解析java中Comparable和Comparator两种比较器_第11张图片

================================================================================================

这里的Comparable和Comparator基本的用法就是这些了,以后需要用到的在写吧! 

你可能感兴趣的:(集合)