Java集合中Comparator和Comparable接口的使用
在Java集合中,如果要比较引用类型泛型的List,我们使用Comparator和Comparable两个接口。
Comparable接口 -- 默认比较规则,可比较的
- 实现该接口表示:这个类的实例可以比较大小,可以进行自然排序
- 定义了默认的比较规则
- 其实现类需要实现comparaTo()方法
- comparaTo()方法返回整数表示大,负数表示小,0表示相等
Comparator接口 -- 临时比较规则,比较工具接口
- 用于定义临时比较规则,而不是默认比较规则
- 其实现类需要实现compara()方法
- Comparator和Comparable都是Java集合框架的成员
我们以学生信息为例演示这两个接口的使用方法
首先定义一个学生类,实现Comparable接口
1 import java.util.HashSet; 2 import java.util.Set; 3 4 /** 5 * 学生类 6 * @author lenovo 7 * 8 */ 9 public class Student implements Comparable<Student> { 10 11 public String id; 12 13 public String name; 14 15 public Set<KeCheng> kecheng; 16 17 @Override 18 public int hashCode() { 19 final int prime = 31; 20 int result = 1; 21 result = prime * result + ((name == null) ? 0 : name.hashCode()); 22 return result; 23 } 24 25 @Override 26 public boolean equals(Object obj) { 27 if (this == obj) 28 return true; 29 if (obj == null) 30 return false; 31 if (!(obj instanceof Student)) 32 return false; 33 Student other = (Student) obj; 34 if (name == null) { 35 if (other.name != null) 36 return false; 37 } else if (!name.equals(other.name)) 38 return false; 39 return true; 40 } 41 42 public Student(String id,String name){ 43 this.id = id; 44 this.name = name; 45 this.kecheng = new HashSet<KeCheng>(); 46 } 47 48 @Override 49 public int compareTo(Student arg0) { 50 // TODO 自动生成的方法存根 51 return this.id.compareTo(arg0.id); 52 } 53 54 }
Comparable的用法如下
1 /* 2 * 对其他类型泛型的List进行排序 3 */ 4 public void testSort3(){ 5 List<Student> stuList = new ArrayList<Student>(); 6 Student stu1 = new Student("3","Tom"); 7 Student stu2 = new Student("1","Jack"); 8 Student stu3 = new Student("2","Lily"); 9 stuList.add(stu1); 10 stuList.add(stu2); 11 stuList.add(stu3); 12 System.out.println("\n-------排序前------------\n"); 13 for (Student st : stuList) { 14 System.out.print("元素:"+st.id+" "+st.name); 15 } 16 Collections.sort(stuList); 17 System.out.println("\n-------排序后------------\n"); 18 for (Student st : stuList) { 19 System.out.print("元素:"+st.id+" "+st.name); 20 } 21 22 }
打印输出的结果为
-------排序前------------ 元素:3 Tom元素:1 Jack元素:2 Lily -------排序后------------ 元素:1 Jack元素:2 Lily元素:3 Tom
Comparator是对List的元素按照Id的自然顺序默认排序,如果想要按照姓名排序,我们需要用到Comparator接口,并且实现其compara方法
1 import java.util.Comparator; 2 3 public class StudentComparator implements Comparator<Student>{ 4 5 @Override 6 public int compare(Student o1, Student o2) { 7 // TODO 自动生成的方法存根 8 return o1.name.compareTo(o2.name); 9 } 10 11 }
然后在我们的测试方法中添加如下代码
1 /* 2 * 对其他类型泛型的List进行排序 3 */ 4 public void testSort3(){ 5 List<Student> stuList = new ArrayList<Student>(); 6 Student stu1 = new Student("3","Tom"); 7 Student stu2 = new Student("1","Jack"); 8 Student stu3 = new Student("2","Lily"); 9 stuList.add(stu1); 10 stuList.add(stu2); 11 stuList.add(stu3); 12 Collections.sort(stuList,new StudentComparator()); 13 System.out.println("\n-------按姓名排序后------------\n"); 14 for (Student st : stuList) { 15 System.out.print("元素:"+st.id+" "+st.name); 16 } 17 }
打印输出的结果为
-------按姓名排序后------------
元素:1 Jack元素:2 Lily元素:3 Tom