Java中的列表排序问题非常的常见,我们经常使用的是自然顺序排序,此时Java本身提供了很好的接口Comparable和Camparator
二者的区别是Comparable接口是自然排序,Camparator接口是为了用于对排列的顺序精准的控制。
Arrays和Collections都重写了sort函数,此时的sort函数一般分为两种,一种是参数为一个数组,另一种参数是一个数组和一个Camparator对象。
举例说明使用Comparable进行排序
import java.util.Arrays;
public class sortdemo {
public static void main(String [] args){
sortObjects();
}
public static void sortObjects(){
final String[] numbers = {"2","1","3","4","5"};
Arrays.sort(numbers);
System.out.print(Arrays.toString(numbers));
}
}
上边的代码主要是直接使用重写好的sort函数进行排序,这个是Arrays自带的,用于自然顺序排序非常简单
但是,如果是一些自定义的类没有实现Comparable接口,那么直接进行sort就是不行的,下边举例:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class NotCamparable {
private int i;
private NotCamparable(final int i){
this.i = i;
}
public static void main(String[] args){
sortNotCamparable();
}
public static void sortNotCamparable(){
final List<NotCamparable> objects = new ArrayList<>();
for(int i = 0; i < 10; i++){
objects.add(new NotCamparable(i));
}
try{
Arrays.sort(objects.toArray());
}catch(Exception e){
System.out.println(e);
}
}
}
此时会输出异常
java.lang.ClassCastException: NotCamparable cannot be cast to java.lang.Comparable
如果想实现自定义的排序方法,可以实现sort所需要的Camparator 接口
然后Collections.sort(numbers, new ReverNumberOrder());
这里numbers是需要排序的数组, 后边的ReverseNumberOrder()是自定义的排序方式(这里显然是倒序,为详细写出代码...)