Comparable
comparable是java的接口,该接口对实现它的每个类的对象进行整体排序。 compareTo 方法被称为它的比较方法。实现此接口的对象列表或数组可以通过 Collections.sort或 Arrays.sort进行自动排序,而无需指定比较器。
Comparator
comparator也是java的接口,对任意类型集合对象进行整体排序,排序时将此接口的实现传递给Collections.sort方法或者Arrays.sort方法排序。
两者的作用类似,并没有什么区别,comparator更像是对comparable的补充。比如我们定义了一个Grade类(学生成绩),该类包括了学生id、语文成绩与数学成绩,此时Grade实现Comparable接口,
重写compareTo()方法,实现按语文成绩排序。但如果需要用到按数学成绩排序的序列时,可以使用Comparator重新定义排序规则,而不需要去修改原来的排序规则。以下为代码实现:
public class Grade implements Comparable<Grade>{ private String stuId; private int chinese; private int math; public String getStuId() { return stuId; } public void setStuId(String stuId) { this.stuId = stuId; } public int getChinese() { return chinese; } public void setChinese(int chinese) { this.chinese = chinese; } public int getMath() { return math; } public void setMath(int math) { this.math = math; } @Override public int compareTo(Grade o) { return this.chinese-o.chinese; } }
public class Test { public static void main(String[] args) { Grade grade = new Grade(); grade.setStuId("12"); grade.setChinese(23); grade.setMath(34); Grade grade1 = new Grade(); grade1.setStuId("13"); grade1.setChinese(25); grade1.setMath(54); Grade grade3 = new Grade(); grade3.setStuId("14"); grade3.setChinese(12); grade3.setMath(59); List<Grade> list = new ArrayList<>(); list.add(grade1); list.add(grade); list.add(grade3); System.out.println("按語文排序:"); Collections.sort(list); for (Grade grade2 : list) { System.out.println(grade2.getStuId()+" "+grade2.getChinese()+" "+grade2.getMath()); } System.out.println("按數學排序:"); Collections.sort(list,(x,y)->{return x.getMath()-y.getMath();});
/* Collections.sort(list, new Comparator<Grade>() {
@Override
public int compare(Grade o1, Grade o2) {
return o1.getMath()-o2.getMath();
}
});*/
for (Grade grade2 : list) { System.out.println(grade2.getStuId()+" "+grade2.getChinese()+" "+grade2.getMath()); } } }
执行结果:
重写compare方法,采用lambda表达式实现,比匿名内部类实现语法上更简单明了。