Comparable和Comparator,Java中comparator
Comparable比较器
可比较的位于java。郎包下,本质上是一个内比较器,实现了可比较的的类可以自己比较,至于比较的结果如何则需要依赖于自然比较方法比较的实现。
比较的返回值有-1、0、1。若比较者大于被比较者,那么返回1,等于则返回0,小于返回-1。
集合。排序和数组。排序可以自动对实现可比较的的对象进行排序。
免费在线学习视频推荐:java学习
示例如下,我们构建一个结节对象,并通过结节对象之间的比较验证可比较的的用法。
结节对象的实现如下:
公共类节点实现可比较对象{
私有(同Internationalorganizations)国际组织数;
私有字符串名称;
@覆盖
公共字符串toString() {
返回 num= num name= name
}
公共节点(整数,字符串名称){
super();
这个数字=数字
this.name=name
}
公共节点(){
super();
}
public int getNum() {
退货数量;
}
public void setNum(int num) {
这个数字=数字
}
公共字符串getName() {
返回名称;
}
公共void集合名称(字符串名){
this.name=name
}
@覆盖
public int compareTo(Object o) {
Node Node=(Node)o;
返回这个。数字节点。getnum();
}
}可以看到,我们为结节实现了可比较的接口,并且重写了比较方法。
先测试一下,我们创建10个结节对象并添加进目录中,然后把顺序打乱。
公共类我的测试{
公共静态void main(String[] args) {
ListNode list=new ArrayList node();
for(int I=0;i 10i ) {
list.add(new Node(i, Node ));
}
//打乱顺序
收藏。洗牌(列表);
for (Node node : list) {
System.out.println(节点);
}
}
}显示结果如下:
数量=7名称=节点
数量=0名称=节点
数量=5名称=节点
num=9名称=节点
数量=6名称=节点
数量=3名称=节点
数量=4名称=节点
数量=8名称=节点
数量=1名称=节点
数量=2名称=节点现在输出是乱序的,接下来我们使用集合。排序对其进行排序。
公共类我的测试{
公共静态void main(String[] args) {
ListNode list=new ArrayList node();
for(int I=0;i 10i ) {
list.add(new Node(i, Node ));
}
//打乱顺序
收藏。洗牌(列表);
收藏。排序(列表);
for (Node node : list) {
System.out.println(节点);
}
}
}集合。排序其实是按比较方法中的定义进行比较,我们之前定义了按照数字的升序进行排序,现在排序结果如下:
数量=0名称=节点
数量=1名称=节点
数量=2名称=节点
数量=3名称=节点
数量=4名称=节点
数量=5名称=节点
数量=6名称=节点
数量=7名称=节点
数量=8名称=节点
编号=9名称=节点Comparator比较器
比较仪位于java.util包下,本质上是一个外比较器。若一个类内部未实现可比较的又或者实现了可比较的但该比较方式不是自己想要的,我们可以考虑实现比较器。比较仪接口里有一个比较方法,使用方法与可比较的中的比较相同。
我们需要将比较仪传递给排序方法,以便对排序顺序进行控制。我们可以查看几个排序方法的使用方法,发现其可以传入一个比较仪参数。
Collections.sort(ListT列表,比较器?超级t c);
Arrays.sort(T[] a,比较器?超级t c);修改我们之前的结节对象,不再实现可比的。
公共类节点{
私有(同Internationalorganizations)国际组织数;
私有字符串名称;
@覆盖
公共字符串toString() {
返回 num= num name= name
}
公共节点(整数,字符串名称){
super();
这个数字=数字
this.name=name
}
公共节点(){
super();
}
public int getNum() {
退货数量;
}
public void setNum(int num) {
这个数字=数字
}
公共字符串getName() {
返回名称;
}
公共void集合名称(字符串名){
this.name=name
}
}我们尝试通过传入一个比较仪来实现降序排序。
公共类我的测试{
公共静态void main(String[] args) {
ListNode list=new ArrayList node();
for(int I=0;i 10i ) {
list.add(new Node(i, Node ));
}
//打乱顺序
收藏。洗牌(列表);
Collections.sort(list,new ComparatorNode() {
@覆盖
公共int比较(节点o1,节点o2) {
返回O2 . getnum()-O1 . getnum();
}
});
for (Node node : list) {
System.out.println(节点);
}
}
}结果如下:
num=9名称=节点
num=8名称=节点
num=7名称=节点
数量=6名称=节点
数量=5名称=节点
数量=4名称=节点
数量=3名称=节点
数量=2名称=节点
数量=1名称=节点
Num=0 name=nodeComparator实现逆序比较。
总结
Compare是内部比较器,Comparator是外部比较器。如果类没有实现compare接口但是需要排序,可以考虑使用比较器。从另一个角度来看,使用Compare接口的耦合性要大于使用Compare的耦合性,因为当我们需要修改Compare算法的时候,也需要修改Compare的实现类。
本文来自java快速入门专栏,欢迎大家一起讨论学习!这就是java中比较器和比较器区别的细节。请多关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。