1.comparator是java的一种机制,用来帮助我们给相同对象的不同属性排序
2.Comparable接口,是一个对象本身就已经支持自比较所需要实现的接口,如String,Integer自己就已经实现了Comparable接口,可以完成比较大小的操作,在sort时,如果不指定Comparator就以自然顺序排序,即实现Comparable接口设定的排序方式
3.Comparator是一个专用的比较器,当对象不支持自比较或者自比较函数必能满足要求时,可以通过写一个比较器来完成两个对象之间的大小的比较。
比如java.util.Arrays下就有按照自然排序的Arrays.sort(a)和按照自定义排序的Arrays.sort(a,cmp)cmp指Comparator
4.举例,对Student对象的不同属性排序
package com.cx.sort; import java.util.Comparator; public class Student { private String name; private int id; public static final Comparator<Student> By_NAME=new ByName(); public static final Comparator<Student> By_ID=new ById(); public String getName() { return name; } public int getId() { return id; } public Student(String name,int id) { this.name=name; this.id=id; } //按照名字排序 private static class ByName implements Comparator<Student>{ public int compare(Student v, Student w) { return v.name.compareTo(w.name); } } //按照id排序 private static class ById implements Comparator<Student> { public int compare(Student v, Student w) { return v.id-w.id; } } }
package com.cx.sort; import java.util.Comparator; public class Test { public static void sort(Object[] a,Comparator comparator) { //插入排序 int N=a.length; for(int i=1;i<N;i++) { for(int j=i;j>0 && less(comparator,a[j],a[j-1]);j--) { exch(a,j,j-1); } } } private static boolean less(Comparator c,Object v,Object w) { //Comparator里的方法是compare() //Comparable里的方法是compareTo() return c.compare(v, w)<0; } private static void exch(Object[] a,int i,int j) { Object swap=a[i]; a[i]=a[j]; a[j]=swap; } private static void show(Student[] a) { for(int i=0;i<a.length;i++) { System.out.println("姓名:"+a[i].getName()+" "+"编号:"+a[i].getId()); } } public static void main(String[] args) { Student a=new Student("a", 5); Student b=new Student("b", 1); Student[] stu= {a,b}; System.out.println("按照编号排序"); sort(stu, Student.By_ID); show(stu); System.out.println("按照姓名排序:"); sort(stu,Student.By_NAME); show(stu); } }
结果:
按照编号排序 姓名:b 编号:1 姓名:a 编号:5 按照姓名排序: 姓名:a 编号:5 姓名:b 编号:1