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

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

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

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

 

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

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

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

 

     这个方法比较参数是两个相同类型的对象,并比较其大小,如果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<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;
    }


    @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() + "  ");
        }
    }
}

测试结果如下:

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

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

 

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

 

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

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

package com.Jevin.compare.demo1;

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

public class PersonComparator implements Comparator<Person> {

    @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()+"  ");
        }
    }
}

运行结果如下:

这里和Comparable的区别看这里:

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

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

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

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值