参考来自:
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,因此就可以对中文排序等。