博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅谈Comparable与Comparator的区别
阅读量:7117 次
发布时间:2019-06-28

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

平时进行自定义排序一直使用实现Comparable接口,一段时间后操作的时候居然发现有了个Comparator接口

上网差了些资料,总结笔记一下。

基本原理就是比较,底层是二叉树

比如是3,6,5,1,7,4,9

排序的时候先放入3,之后6比3大,烦恼如3右边,5比6小,放左边,一次类推就是线面这图

 

首先看一下Comparable的接口定义

package java.lang;import java.util.*;public interface Comparable
{ public int compareTo(T o);}

Comparable对实现它的每个类的对象进行整体排序。这个接口需要类本身去实现

代码实例分析

package com.list.customsort;import java.util.ArrayList;import java.util.Collections;import java.util.List;public class TestSort {    public static void main(String[] args) { List
list = new ArrayList<>(); list.add(new Person("fd",20)); list.add(new Person("chy",22)); list.add(new Person("wgj",21)); System.out.println(list); Collections.sort(list); System.out.println(list); } } class Person implements Comparable
{ private String name; private Integer age; public Person(String name, Integer age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } @Override public int compareTo(Person o) { // return this.getAge().compareTo(o.getAge()); return this.getName().compareTo(o.getName());//按姓名进行正序排序。abc } }

是根据person的name属性进行排序  结果:

不使用Collections.sort()方法的话,可以直接使用treeSet集合进行操作

Set
set = new TreeSet<>(); set.add(new Person("fd",20)); set.add(new Person("chy",22)); set.add(new Person("wgj",21)); System.out.println(set);

结果跟上面时一模一样的也是根据name来实现了排序

为什么呢,查看treeset源码会发现走还是compareto方法

所以使用Collections.sort(list) 跟直接new TreeSet是一样的效果。

 

Comparator

Comparator是比较接口,我们如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排序,这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过实现Comparator来新建一个比较器,然后通过这个比较器对类进行排序。

接口定义

package java.util;public interface Comparator
{ int compare(T o1, T o2); boolean equals(Object obj);}

代码实例分析

package com.list.customsort;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;import java.util.Set; import java.util.TreeSet; public class TestSort2 { public static void main(String[] args) { List
list = new ArrayList<>(); list.add(new Person2("fd",20)); list.add(new Person2("chy",22)); list.add(new Person2("wgj",21)); System.out.println(list); Collections.sort(list,new Comparator
() { @Override public int compare(Person2 o1, Person2 o2) { return o1.getAge().compareTo(o2.getAge()); } }); System.out.println(list); } } class Person2{ private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Person2(String name, Integer age) { super(); this.name = name; this.age = age; } @Override public String toString() { return "Person2 [name=" + name + ", age=" + age + "]"; } }

 

main方法的sort方法可以使用lambda来进行简化

(public static <T> void sort(List<T> list, Comparator<? super T> c) )

Collections.sort(list,(s1,s2)-> Integer.compare(s1.getAge(),s2.getAge()));

 

这个时候使用treeset集合的话就没效果了。

因为它底层使用的是compareTo方法。

Comparable和Comparator区别比较

Comparable是排序接口,若一个类实现了Comparable接口,就意味着“该类支持排序”。而Comparator是比较器,我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。

Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。

两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。

ok,到位!!!

 

转载于:https://www.cnblogs.com/chywx/p/9661007.html

你可能感兴趣的文章
WAF与IPS的区别总结
查看>>
oracle开启/关闭归档模式
查看>>
插入排序
查看>>
手机号码归属地查询
查看>>
会议室预定设计
查看>>
JavaScript:Date 对象
查看>>
微信小程序之 Classify(商品属性分类)
查看>>
把java程序打包成.exe
查看>>
基于Redis的分布式锁的简单实现
查看>>
Python笔记---错误笔记
查看>>
sql server 索引阐述系列五 索引参数与碎片
查看>>
最课程学员启示录:一份有诚意的检讨书
查看>>
即时通信(IM)和实时通信(RTC)的区别
查看>>
面试题解:输入一个数A,找到大于A的一个最小数B,且B中不存在连续相等的两个数字...
查看>>
Linux Linux程序练习九
查看>>
Nginx的启动、停止与重启
查看>>
Windows 64 位 mysql 5.7.20 安装教程
查看>>
css点滴3—5种方式实现圆环
查看>>
剑指offer 最小的k个数 leetcode 215. Kth Largest Element in an Array
查看>>
screen 命令使用及示例
查看>>