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

 

posted @ 2016-07-19 11:25  Web1024  阅读(530)  评论(0编辑  收藏  举报