2017.5.16 comparator和comparable的比较及使用

参考来自:

http://blog.csdn.net/lifuxiangcaohui/article/details/41543347

http://www.cnblogs.com/liuyuanyuanGOGO/p/java_collections.html

1.comparable的使用示例

可以看到,实现Comparable接口后,必须要重写compareTo方法。这样就使得我们自定义的类StudentDTO具备比较功能。当把StudentDTO放入集合中时,就可以对集合内的参数进行排序。

 1 public class StudentDTO implements Comparable{
 3   private String name;
 4   private int age;
 5 
 6     //setter和getter略
 7 
 8    @Override
 9     public int compareTo(Object o){
10        StudentDTO sdto = (StudentDTO)o;
11        int otherAge = sdto.getAge();
12        //注意这里的compareTo取决于参数类型,比如这里是int的比较
13        return this.age.compareTo(otherAge);
14     }
15 }
 1 public static void main(String[] args){
 3       List<StudentDTO> studentList = new ArrayList();
 4 
 5       StudentDTO s1 = new StudentDTO ();
 6       s.setName("yuanyuan");
 7       s.setAge(22);
 8       studentList.add(s1);
 9 
10       StudentDTO s1 = new StudentDTO ();
11       s.setName("lily");
12       s.setAge(23);
13       studentList.add(s2);
14 
15       Collections.sort(studentList);  //按照age升序 22,23,
16       Collections.reverse(studentList);  //按照age降序 23,22   
17 }

2.comparator的使用示例

 1 class MyCompartor implements Comparator{
 3      @Override
 4      public int compare(Object o1, Object o2){
 6            StudentDTO sdto1= (StudentDTO)o1;
 7            StudentDTO sdto2= (StudentDTO)o2;
 8            return sdto1.getAge.compareTo(stdo2.getAge());
 9     }
10 }
 1 public static void main(String[] args){
 3       List<StudentDTO> studentList = new ArrayList();
 4       StudentDTO s1 = new StudentDTO ();
 5       s1.setName("yuanyuan");
 6       s1.setAge(22);
 7       studentList.add(s1);
 8 
 9       StudentDTO s2 = new StudentDTO ();
10       s.2setName("lily");
11       s2.setAge(23);
12       studentList.add(s2);
13 
14       MyComparetor mc = new MyComparetor();
15       Collections.sort(studentList,mc);     //按照age升序 22,23,
16       Collections.reverse(studentList,mc);    //按照age降序 23,22   
17 }

还有一种更常用的写法:

 1 //前面略
 2 Collections.sort(studentList, new Comparator<StudentDTO>(){  
 3             /*  
 4              * int compare(Student o1, Student o2) 返回一个基本类型的整型,  
 5              * 返回负数表示:o1 小于o2,  
 6              * 返回0 表示:o1和o2相等,  
 7              * 返回正数表示:o1大于o2。  
 8              */  
 9             public int compare(StudentDTO o1, StudentDTO o2) {  
11                 //按照学生的年龄进行升序排列  18                 return o1.getAge().compareTo(o2.getAge());  
19             }  
20         }); 

3.CompareTo方法

由前面可知,当自定义类StudentDTO实现comparable接口后,重写了方法compareTo()具备了比较功能。

而java中的基本类都具备比较功能。比如String类:

1 public final class String implements java.io.Serializable, Comparable<String>, CharSequence
 1 public int compareTo(String anotherString) {
 2         int len1 = value.length;
 3         int len2 = anotherString.value.length;
 4         int lim = Math.min(len1, len2);
 5         char v1[] = value;
 6         char v2[] = anotherString.value;
 7 
 8         int k = 0;
 9         while (k < lim) {
10             char c1 = v1[k];
11             char c2 = v2[k];
12             if (c1 != c2) {
13                 return c1 - c2;
14             }
15             k++;
16         }
17         return len1 - len2;
18     }

所以当使用Collection.sort(list<String>())时,可以直接用。而对于自定义的类,就需要用上述两种方法中的一种来完成排序。

其次,Collections.sort()、Arrays.sort()是类似的方法。不过针对不同的类型。

并且方法里的参数可以有locale,因此就可以对中文排序等。

原文地址:https://www.cnblogs.com/lyh421/p/6860069.html