Comparable 和 Comparator 都是用来实现集合中元素的比较、排序的,区别在于 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。
Comparator位于包Java.util下,而Comparable位于包 java.lang下
如果List<Object>中Object实现了Comparator接口,便可以直接用以下的方式对List进行排序
还有另外一种Collections.sort(list, comparator),需要自定义匿名类
package test.kang;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Test_compare {
public static void main(String[] args) {
ArrayList<Student> list=new ArrayList<Student>();
Student s1=new Student(11, "xiaoming", "grade1");
Student s2=new Student(12, "xiaohong", "grade3");
Student s3=new Student(31, "xiaohua", "grade2");
Student s4=new Student(21, "xiaozhang", "grade1");
Student s5=new Student(41, "xiaoxin", "grade3");
Student s6=new Student(40, "xiaodang", "grade5");
Student s7=new Student(30, "xiaodang", "grade4");
Student s8=new Student(20, "xiaodang", "grade2");
list.add(s1);list.add(s2);list.add(s3);list.add(s4);
list.add(s5);list.add(s6);list.add(s7);list.add(s8);
for (Student s : list) {
System.out.println(s.getGrade()+ "---" +s.getId() + "---" + s.getName());
}
System.out.println("------分割线------");
Collections.sort(list);//使用Student类自定义规则来排序
for (Student s : list) {
System.out.println(s.getGrade()+ "---" +s.getId() + "---" + s.getName());
}
System.out.println("------分割线------");
/*匿名类实现排序Collections.sort(list, comparator);
*这里的排序我定义了先按照年级排,再按照序号从大到小排
*/
Collections.sort(list, new Comparator<Student>(){//使用匿名类自定义规则来排序
@Override
public int compare(Student o1, Student o2) {
int num = o1.getGrade().compareTo(o2.getGrade()) ;
int num1 = (num == 0 ? (o1.getId()-o2.getId()<0?1:-1): num);//倒序
return num1;
}
});
for (Student s : list) {
System.out.println(s.getGrade()+ "---" +s.getId() + "---" + s.getName());
}
}
}
class Student implements Comparable<Student>{
private int id;
private String name;
private String grade;
public Student(int id, String name, String grade) {
super();
this.id = id;
this.name = name;
this.grade = grade;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGrade() {
return grade;
}
public void setGrade(String grade) {
this.grade = grade;
}
/*这里的排序我定义了先按照年级排,再按照序号从小到大排
*/
@Override
public int compareTo(Student s) {
int num = this.grade.compareTo(s.grade) ;
int num1 = (num == 0 ? (this.id-s.id>0?1:-1): num);//顺序
return num1;
}
}