千哥说娱乐
当前位置:首页 - 学习 >

使用Java当中的内比较器与外比较器来实现排序

2019-10-12来源:燃点网

对于Java中引用类型的对象,自身是没有排序的功能的,要想对这些对象进行排序,需要实现一个比较器,定义它的排序规则。而在JDK中,也提供了这样的比较器,来对这些引用数据类型的对象进行排序,常用就是内部比较器(Comparable)与外部比较器(Comparator)。

使用Java当中的内比较器与外比较器来实现排序

使用Java当中的内比较器与外比较器来实现排序

内部比较器,顾名思义,就是在这个对象的内部实现排序算法,Java很多基础类都实现了Comparable接口;外部比较器则是定义一个该对象的比较器,在这个比较器中实现排序算法。话不多说上代码。

package com.pig.compare;
public class Player {
private String name;
private int skill;

public Player(String name, int skill) {
super();
this.name = name;
this.skill = skill;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSkill() {
return skill;
}
public void setSkill(int skill) {
this.skill = skill;
}
@Override
public String toString() {
return "Player " + name + "," + skill + "]";
}

}

首先定义一个Player,有名字和技能,假如是要实现内比较器,也就是实现Comparable的接口,在Player原有代码增加如下:

使用Java当中的内比较器与外比较器来实现排序

这样就实现了一个拥有比较器的对象,测试一下:

使用Java当中的内比较器与外比较器来实现排序

可以看出,经过Collections.sort()之后,成了一个升序的排列,这个升序和你的排序算法相关,也就是compareTo方法的实现。

Collections.sort()方法不但可以传进一个实现了比较器的对象集合,还可以指定比较器对象:

使用Java当中的内比较器与外比较器来实现排序

这个比较器对象,就是我们接下来要说的外部比较器:Comparator。对于外部比较器,我们不需要在我们写的实体类上加比较器,然后实现一个比较方法,使用外部比较器可以保留实体类的原汁原味,而只是在外部比较器中对指定实体类对象进行排序,代码如下:

package com.pig.compare;
import java.util.Comparator;
public class PlayerComparator implements Comparator{
@Override
public int compare(Player o1, Player o2) {
return o1.getSkill() - o2.getSkill();
}
}

而Player对象就是原来我们写的,不加Comparable接口的那个对象,运行一下看结果:

使用Java当中的内比较器与外比较器来实现排序

也是达到了同样的结果。

不知道大家注意到没有,Comparator加上了@FunctionalInterface注解,这是一个函数式接口,那我们就别客气了,就利用函数式接口的特性来实现比较器:

使用Java当中的内比较器与外比较器来实现排序

不用再专门定义一个外部比较器,然后传进排序集合工具类中进行排序了,方便快捷,减少代码量。

下面就可以总结一下它们的区别:

1、一个是内比较器(Comparable)对代码不友好,一个是外比较器(Comparator)没有代码侵入

2、位置不同,Comparator位于包java.util下,而Comparable位于包 java.lang下

3、Comparator 是策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象来改变它的行为

4、Comparator是一个函数式接口,可以使用 Lambda表达式来实现比较器

转载文章地址:http://www.xxglsh.com/xuexi/49452.html
(本文来自千哥说娱乐整合文章:http://www.xxglsh.com)未经允许,不得转载!
标签:
网站简介 联系我们 网站申明 网站地图

版权所有:www.xxglsh.com ©2017 千哥说娱乐

千哥说娱乐提供的所有内容均是网络转载或网友提供,本站仅提供内容展示服务,不承认任何法律责任。