概述
Collections是JDK提供的工具类,同样位于java.util包中。它提供了一系列静态方法,能更方便地操作各种集合,其中有这样一个方法
public static <T extends Comparable<? super T>> void sort(List<T> list) {
list.sort(null);
}
Comparable接口
使用Comparable接口对对象进行排序
public static <T extends Comparable<? super T>> void sort(List<T> list) {
}
在这个方法中,如果要求传入的类要实现Comparable接口,如果没有实现Comparable接口,那么是不允许调用这个方法的
那么Comparable接口是用来做什么的呐?
我们先来看这样一个例子
List<Integer> integerList = new ArrayList<>();
integerList.add(3);
integerList.add(4);
integerList.add(5);
integerList.add(1);
integerList.add(2);
Collections.sort(integerList);
System.out.println(integerList);
我们可以看到我们乱序往integerList中写入,3,4,5,1,2,再调用Collections.sort(integerList);之后输出的是正确排序。怎么做到的呐?
我们知道调用Collections.sort方法需要List中的对象实现Comparable,那么Integer是否实现了呐?
我们点进Integer中去寻找
答案是肯定的,它确实实现了Comparable,我们知道实现Comparable接口必须实现compareTo方法,Integer中是否实现了呐?
当然
加上接口名compareTo,我们就能推测Comparable接口的作用了,它是用来定义两个对象如何比较的接口,我们可以看到compareTo调用了compare方法,在compare方法中可以看到如下实现
而
(x < y) ? -1 : ((x == y) ? 0 : 1)
的意思是如果x<y返回 -1 ,x==y返回0,那么也就能知道当x>y时返回1了,刚刚看到这样写法是从小到大的返回,如果要从大到小的返回,该怎么做呐?
这样做
(x < y) ? 1 : ((x == y) ? 0 : -1)
只需要将1和-1的位置调换一下就好了,它的返回就是从大到小了,当然我们是没有办法改变Integer中的compare方法的,但是当我们定义一个类的时候是可以这样实现的,当然如果你想调用Collections.sort方法,那么在你定义的类中应该实现Comparable接口,重写compareTo方法。
来看个例子吧,在这个类中我们实现了Comparable,接口并重写了重写compareTo方法
public class Fish implements Comparable<Fish> {
private int age;
private String name;
public Fish(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "SortTest{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
@Override
public int compareTo(Fish o) {
if (this.age<o.age){
return -1;
}else if (this.age>o.age){
return 1;
}
return 0;
}
}
在compareTo我们定义的是年龄小的返回-1,相等返回0,大的返回1,那么它就应该是按年龄从小到大排序的,我们来看
List<Fish> list= new ArrayList<>();
list.add(new Fish(5, "DogA"));
list.add(new Fish(6, "DogB"));
list.add(new Fish(7, "DogC"));
Collections.sort(list);
System.out.println(list);
结果符合,完美!!!
如果想要按年龄从大到小的排序呐?只需要做如下修改即可
我们知道,小于返回-1,相等返回0,大于返回1,显示的是从小到大排序,当小于返回1,相等返回0,大于返回-1时,显示是就是从大到小的排序。
我们看一下结果
结果与预期一致,perfect
最后补充一点:
public int compareTo(Fish o) {
if (this.age<o.age){
return -1;
}else if (this.age>o.age){
return 1;
}
return 0;
}
很多人,可能会思考compareTo要如何写呐?你想如何写都行,它是用来定义你如何比较两个对象的,你想按年龄、按名字比都可以,按年龄比按如上写法写,按名字比则可以考虑用equal比。总的来说,就是,你想按年龄、按名字比都可以,但是你得在compareTo中写清楚比较的方法,这样调用Collections.sort的时候,sort就知道如何比较两个相同对象了。
ok。。完美!
Comparator类实现对象的排序
Comparator也可以实现对象的排序,它和Comparable的区别是什么呐?在一个类中可以实现多个Comparator对 对象 进行排序,仍然以Fish为例
public class Fish {
private int age;
private String name;
public Fish(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "SortTest{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
public static Comparator<Fish> FishAgeComparator = new Comparator<Fish>() {
@Override
public int compare(Fish s1, Fish s2) {
int age1 = s1.age;
int age2 = s2.age;
return age1-age2;
}
};
}
public static void main(String args[]){
List<Fish> list= new ArrayList<>();
list.add(new Fish(5, "DogA"));
list.add(new Fish(6, "DogB"));
list.add(new Fish(7, "DogC"));
Collections.sort(list, Fish.FishAgeComparator);
System.out.println(list);
}
结果一样,没有问题!!!