对象的比较comparable与comparator
来源:互联网 发布:手机天猫 手机淘宝 编辑:程序博客网 时间:2024/05/17 23:41
在java中,同一个类的实例之间经常需要进行比较。如果有两个employee对象,你很可能需要知道他们之中哪一位在这家公司待的更久一些,或者希望按年龄升序或者降序排列之后再显示搜索结果。通过实现java.lang.Comparable和java.uti.Comparator接口,可以使对象具有可比较性。
一、使用java.lang.Comparable
实现了java.lang.Comparable接口,就必须重写它的抽象方法compareTo()
public int compareTo(T o);
@Overridepublic int compareTo(Person o) {if (this.age > o.age) {return 1;} else if (this.age < o.age) {return -1;} return 0;}
这样这个对象就具备了比较性,并且使用java.util.Arrays的静态方法sort可以对任意对象数组进行排序。compareTo方法中的参数o是指这个对象进行比较的对象。如果这个对象大于参数对象,这个方法在实现类中的代码就必须返回一个正值;如果这个对象小于参数对象,则返回一个负值。默认这个规则是升序的,若想降序,则可以使正负值相调换即可。
二、实现java.lang.Comparator
实现java.lang.Comparable使你能够定义一种对类的实例进行比较的方法。然而,对象有的时候可以通过多种方式进行比较。例如,俩个Person对象可能需要按照年龄或者姓名比较,这时使用第一种方式就不行了,因为第一种方式只能在类中定义一种比较。为了使对象具有俩种比较方式,这就需要实现java.lang.Comparator接口,定义两个比较器来进行比较。重写抽象方法compare
int compare(T o1, T o2);
@Overridepublic int compare(Person o1, Person o2) {if (o1.getAge() > o2.getAge()) {return 1;} else if (o1.getAge() < o2.getAge()) {return -1;}return 0;}
另外再依照这个比较器重写一个按姓名比较的比较器,此处偷懒!
集合排序或者是数组排序都有传入比较器进行比较或者排序的方法。下图是Collections和Arrays的带有比较器的排序方法
public static <T> void sort(List<T> list, Comparator<? super T> c) { list.sort(c); }
public static <T> void sort(T[] a, Comparator<? super T> c)
三、总结
两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码,。用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。
- 对象的比较Comparable与Comparator
- 对象的比较comparable与comparator
- Comparable与Comparator的比较
- Comparable与Comparator的比较
- Comparable与Comparator的比较
- Comparable 与 Comparator 比较
- Java的比较接口 Comparable与Comparator
- Comparable与Comparator之比较
- comparator与Comparable比较器
- 对象的比较--Comparable接口和Comparator接口的使用
- 对象排序Comparator与Comparable
- Comparable和Comparator的比较
- Comparable和Comparator的比较
- comparator接口与Comparable接口的区别【比较】
- Java中常用的比较器Comparable与Comparator
- Comparable和Comparator之对象比较
- Comparable和Comparator实现对象比较
- java对象比较规则:Comparable & Comparator
- 查找数据库中某一字段所在表
- 51node-1174-区间中最大的数(RMQ)
- ffmpeg音频处理——pcm格式与resample(重采样)
- 数组右移
- JAVA里的空白\t\n\r分别代表什么?
- 对象的比较comparable与comparator
- 环境变量配置
- android 长按监听
- python3爬虫基础学习
- Java 配置环境变量
- 三招两式,轻松搞定Excel文本算式
- 汇付科技新员工IT环境须知
- 【上海校区】海哥解惑-常见中文乱码问题解决方式
- java数据结构与算法-有序链表