之前对排序的使用一直没系统学习,这次好好学一遍。
前言
JAVA中使用排序大致分为两种:
- 一种是Arrays的sort()方法,可根据各种数据类型(基本与引用类型)数组排序。
- 一种是Collections的sort(),针对集合进行排序(例如ArrayList、TreeMap等)
但是如果我们想要自定义排序规则时,就需要用到两个接口。
- Comparable接口,出自java.lang,需要重写compareTo(Object obj)方法
- Comparator接口,出自java.util,需要重写compare(Object obj1, Object obj2)方法
先分别介绍一下,再进行比较。
Comparable
源代码,去掉注释后:
package java.lang;
import java.util.*;
public interface Comparable<T> {
public int compareTo(T o);
}
可见源码非常短,只提供了一个方法compareTo(T o),返回值是int。
比较规则:
1、比较者大于被比较者(也就是compareTo方法里面的对象),那么返回正整数
2、比较者等于被比较者,那么返回0
3、比较者小于被比较者,那么返回负整数
使用方法如下,会输出倒序排序:
public class test {
public static void main(String[] args) {
ArrayList<student1> list = new ArrayList<>();
list.add(new student1("smMid", 12));
list.add(new student1("smBig", 18));
list.add(new student1("smTiny", 6));
Collections.sort(list);
for (student1 student1 : list) {
System.out.println(student1.toString());
}
}
}
class student1 implements Comparable<student1>{
String name;
int age;
public student1(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(student1 o) {
return o.age - this.age;
}
@Override
public String toString() {
return "student1{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
Comparator
它是一个功能型接口,往往搭配匿名内部类使用。
Comparator接口里面有一个compare方法,方法有两个参数T o1和T o2,分别表示待比较的两个对象,方法返回值是int,有三种情况:
1、o1大于o2,返回正整数
2、o1等于o2,返回0
3、o1小于o2,返回负整数
使用方法如下,我们通过匿名内部类的方式,重写compare方法,这里会输出逆序。
public class test {
public static void main(String[] args) {
ArrayList<student2> list = new ArrayList<>();
list.add(new student2("smMid", 12));
list.add(new student2("smBig", 18));
list.add(new student2("smTiny", 6));
Collections.sort(list, new Comparator<student2>() {
@Override
public int compare(student2 o1, student2 o2) {
return o2.age - o1.age;
}
});
for (student2 student2 : list) {
System.out.println(student2);
}
}
}
class student2{
String name;
int age;
public student2(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "student2{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
二者比较
comparable的使用方式是类继承comparable接口,在类中重写compareTo方法;
comparator的使用方式是作为比较器参数,传入例如Collections.sort()方法中。
二者功能一样,但是当我们无法修改类的时候,我们就只能用comparator,比如说给TreeMap指定排序规则,我们无法修改源码,那就只能使用comparator进行排序。