博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解析java中Comparable和Comparator两种比较器
阅读量:2347 次
发布时间:2019-05-10

本文共 3590 字,大约阅读时间需要 11 分钟。

        最近遇到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
{ 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
{ @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基本的用法就是这些了,以后需要用到的在写吧! 

转载地址:http://lrtvb.baihongyu.com/

你可能感兴趣的文章
三层交换机是否会代替路由器?
查看>>
5--TCP的状态
查看>>
6--企业常用防火墙iptables相关原理详解
查看>>
7--企业常用防火墙iptables核心配置讲解
查看>>
1.block_inode
查看>>
2.Linux文件和目录之间对应关系
查看>>
4.硬链接和软链接
查看>>
可能返回 null 的 SQL 语句
查看>>
以下关于STL的描述中,错误的有
查看>>
假设某棵二叉查找树的所有键均为1到10的整数,现在我们要查找5。下面____不可能是键的检查序列。
查看>>
给定一个整数sum,从有N个无序元素的数组中寻找元素a、b、c、d,使得 a+b+c+d =sum,最快的平均时间复杂度是____。
查看>>
设二叉树结点的先根序列、中根序列和后根序列中,所有叶子结点的先后顺序____。
查看>>
将整数序列(7-2-4-6-3-1-5)按所示顺序构建一棵二叉排序树a(亦称二叉搜索树),之后将整数8按照二叉排序树规则插入树a中,请问插入之后的树a中序遍历结果是____。
查看>>
IP地址、子网掩码、网络号、主机号、网络地址、主机地址
查看>>
已知int a[]={1,2,3,4,5};int*p[]={a,a+1,a+2,a+3};int **q=p;表达式*(p[0]+1)+**(q+2)的值是____。
查看>>
CPU输出数据的速度远远高于打印机的打印速度,为了解决这一矛盾,可采用()
查看>>
整型字符常量和字符字面量的区别 sizeof(char) 和 sizeof('a')
查看>>
表的主键特点中,说法不正确的是()
查看>>
用变量a给出下面的定义:一个有10个指针的数组,该指针指向一个函数,该函数有一个整形参数并返回一个整型数
查看>>
冯诺依曼工作方式的基本特点是____
查看>>