java集合三种比较器(详解)集合三种比较器(详解)
关于关于java集合比较器的创建和使用集合比较器的创建和使用
概述:概述: 在java集合中,TreeSet集合和TreeMap集合底层数据结构都是自平衡二叉树,所以在这两个集合中添加元素的时候会
实现自动排序,排序方式为中序排序(即左根右的方式进行排序,详情请见二叉树数据结构,这里不做赘述)。
SUN公司编写源代码的时候已经为我们写好了排序代码,因此在我们输入数据元素后会实现自动排序(这里的数据都是对象,
也就是引用类型,不能是基本数据类型不能是基本数据类型),源码中可见底层是调用了compareTo()方法进行了排序(详情请见TreeSet或者
TreeMap源码)
如果我们要实现自定义的引用类型排序需要重写排序方法,就必须重写排序方法,有两个选择,一个是实现Comparable接
口,另一个是实现Comparator接口,下面对两个接口进行介绍。
第一个比较器:实现第一个比较器:实现 Comparable接口接口
Comparable接口接口:这个接口要在自定义的类上实现,比如定义了一个Person类,实现Comparator接口,除了该类应有的属
性、构造器、方法外,我们需要实现该接口中的抽象方法 compareTo()并且需要指定其泛型(也就是要比较的引用数据的类
型),意思就是说要比较的是泛型也就是中间的类型
其中方法内的编写规则是自己根据需求编写的,请看代码。
//比较器一:实现Comparable接口,在compareTo()方法中编写比较规则
class Person implements Comparable{
int age;
String name;
public Person(int age,String name){
this.age=age;
this.name=name;
}
public int compareTo(Person c){
if(c.age==this.age){ //如果年龄相同就按名字排序
return this.name.compareTo(c.name);
}else{ //年龄不同,按年龄排序
return this.age-c.age;
}
}
}
Person c的这个变量c就是增加数据的时候传入的Person对象,this.name和this.age都为之前添加的Person对象。
我们来看compareTo方法代码块return this.name.compareTo(c.name); 这里是当年龄相同的时候,用姓名来进行比较排序,
而Person对象的name是个字符串,SUN公司已经重写了字符串的比较规则,这里直接调用即可
注意:这里调用的compareTo方法是String类中重写的compareTo方法,并不是我们重写的方法。
年龄不同的情况下可直接返回此时传来的Person对象的年龄和上一个年龄的差值
所谓比较规则,就是比较出两个数据的顺序,或者说是大小,所以这里运用相减的形式,若差值为正则说明上一个Person对
象的年龄大,反之亦然。String重写的compareTo方法是按照字符所对应的ASCLL值进行排序的,感兴趣的小伙伴可以去源码
看一下,这里就不做过多说明。
Comparable接口用法总结:接口用法总结: 简单来说,要通过实现Comparable接口重写比较方法需要:
1.让要比较的类实现Comparable接口,并指定要比较的引用数据类型,文中是Person。
2.重写compareTo()方法即可,重写自己需要的比较规则。(程序执行时底层会自动调用,详情请看源码)
第二个比较器:第二个比较器:Comparator接口接口
Comparator接口接口:这个接口需要我们重写定义一个类来实现它,我们可以称这个类为:比较器比较器,比如我们定义了一个类(也
就是比较器)来实现Comparator接口,并且需要指定比较类型类型(用泛型来制指定,在实现接口的时候指定)最简单的比
较器,我们需要实现该接口中的抽象方法 compare()即可,只要实现了该比较方法就已经实现了比较器的功能,当然也可以加
别的属性和方法,但是没必要,接下来请看代码。
//比较器二:实现Comparator接口,在compare()方法中编写比较规则
class MyComparator1 implements Comparator{
public int compare(Person p1,Person p2){
if(p1.age==p2.age){ //年龄相同用名字排序
return p2.name.compareTo(p1.name);
}else{ //年龄不同用年龄排序
return p1.age-p2.age;
评论0
最新资源