比如 int ,double 等基本类型数据,Java 可以对他们直接进行比较排序,但是在 Java 中经常会涉及到对 对象数组 的排序问题,那么就涉及到对象之间的比较问题 ,这时应该怎么办?
对象之间的排序要用到比较器
Java 实现对象排序的方式有两种:
自然排序: java.lang.Comparable
定制排序: java.util.Comparator
一.概述
Java 中的排序是由 Comparable 和 Comparator 这两个接口来实现的。
Comparable表示可被排序的,实现该接口的类的对象自动拥有排序功能。
Comparator则表示一个比较器,一般情况, 这个比较器将作为一个参数进行传递。
二.Comparable(自然排序)
Comparable 接口强行对实现它的每个类的对象进行整体排序
public interface Comparable<T> {
public int compareTo(T o);
}
- Comparable 的中文意思就是可被排序的,代表本身支持排序功能。只要我们的类实现了这个接口,那么这个类的对象就会自动拥有了可被排序的能力。而且这个排序被称为类的自然顺序。
- 这个类的对象的列表可以被Collections.sort()和Arrays.sort()来执行排序。
- 从源码中可以看到,该接口只有一个抽象方法compareTo() 这个方法主要就是为了定义我们的类所要排序的方式。compareTo()方法用于比较当前元素 a与指定元素 b的大小,结果为int值,如果a >b,int值>0; 如果a=b, int值=0;如果a<b, int值<0。
三.Comparator(定制排序)
在实际开发中,遇到当元素的类型实现了 Comparable 接口,但是它的排序方式不适合当前的操作;或者根本没有实现 Comparable接口,而又不方便修改代码。那么可以考虑使用定制一个 Comparator 的对象进行排序。
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
Comparator 中文译为比较器,它可以作为一个参数传递到Collections. sort()和Arrays.sort()方法,来指定某个类的对象的列表的排序方式。
四.二者比较
- Comparable 可以看做是内部比较器,Comparator 可以看做是外部比较器。
- 一个类, 可以通过实现 Comparable 接口来自带有序性,也可以通过额外指定 Comparator 来附加有序性。二者的作用其实是一致的, 所以不要混用。
五.总结
- Comparable为可排序的,实现该接口的类的对象自动拥有可排序功能。
- Comparator为比较器,实现该接口可以定义一个针对某个类的排序方式。
- Comparator与Comparable同时存在的情况下,前者优先级高。
- Comparable和Comparator接口是用来对自定义的类class进行大小比较的。
- Comparator和 Comparable的区别:Comparator定义在类的外部,而Comparable定义在类的内部。
六.具体实现
1.Comparable 定义在类的内部
例如:
public class Person implements Comparable<Person> {
String name;
int age;
public int compareTo(Person o) {
return this.age-o.age;
}
}
因为 Person 类已经实现了 Comparable 接口,那么 Person 类现在是一个可以比较大小的对象了,它的比较功能和 String 完全一样,可以随时随地的拿来比较大小,因为 Person 对象现在自身就是有大小之分的。
如果:
List < Person> list=new ArrayList()<>;
Collections.sort(list); //可以得到正确的结果
2.Comparator 定义在类的外部
此时Person类的结构不需要有任何变化,
public class Person {
String name;
int age;
}
然后另外定义一个比较器:
public PersonComparator implements Comparator<Person> {
int compare(o1,o2){
return o1.name.compareTo(o2.name);
}
}
使用:
List<Person> list=new ArrayList<>();
Collections.sort(list,new PersonComparator());