Comparable与Comparator接口
从上面的两个接口看Collections.sort()与Arrays.sort()的两种用法是这篇文章的主要目的。
Collections.sort()是集合的排序,在使用此方法的时候有两种途径可供我们选择:一种是要排序的集合中的成员实现Comparable接口,并重写conpareTo();另一种是实现自己的排序类(实现Comparator),并作为参数传给sort()方法。示意如下:
方法1: class Student implenents Comparable{compareTo()}//要排序的类
ArrayList list = new ArrayList().add(new Student());//将上诉类装到集合中
Collection.sort(list);//调用Collection的sort()方法进行排序
方法2: class Student{}//要排序的类
MyComparator implenents Comparator{compare()}//实现自己的排序类
ArrayList list = new ArrayList().add(new Student());//将上诉类装到集合中
Collection.sort(list,new MyComparator());//调用Collection的sort()方法进行排序,并将自己的排序类作为参数传递
Arrays.sort()是对数组尽心排序,排序的途径与Collection类似。一种是要排序的集合中的成员实现Comparable接口,并重写conpareTo();另一种是实现自己的排序类(实现Comparator),并作为参数传给sort()方法。示意如下:
方法1: class Student implenents Comparable{compareTo()}//要排序的类
Student[] student = {new Student()}//此时不是装到集合中,而是装到数组中
Arrays.sort(list);//调用Arrays的sort()方法进行排序
方法2: class Student{}//要排序的类
MyComparator implenents Comparator{compare()}//实现自己的排序类
Student[] student = {new Student()}//此时不是装到集合中,而是装到数组中
Arrays.sort(list,new MyComparator());//调用Arrays的sort()方法进行排序,并将自己的排序类作为参数传递
从上面的抽象出的过程可以看出,Collections与Arrays的排序过程是一样的,只不过是将Collection换做Arrays而已。
下面给出类的目录结构图:,上面的Comparable是测试Comparable按案例,下面的Comparator是测试Comparator的案例,两种案例中分别给出了集合和数组的排序。下面给出具体的测试代码,按照上图中的从上到下的类顺序:
1 package Comparable; 2 3 import java.util.Arrays; 4 5 import org.junit.Test; 6 7 public class ArraysTest { 8 @Test 9 public void test(){ 10 Student stu1 = new Student("alsa", 21); 11 Student stu3 = new Student("foas", 17); 12 Student stu4 = new Student("mike", 25); 13 Student stu6 = new Student("zieka", 17); 14 Student stu2 = new Student("dava", 24); 15 Student stu5 = new Student("nose", 14); 16 17 Student[] student = {stu1,stu2,stu3,stu4,stu5,stu6}; 18 19 System.out.println("排序前"); 20 for(int i = 0;i<student.length;i++){ 21 System.out.println(student[i]); 22 } 23 24 Arrays.sort(student); 25 26 System.out.println("排序后"); 27 for(int i = 0;i<student.length;i++){ 28 System.out.println(student[i]); 29 } 30 } 31 }
1 package Comparable; 2 3 import java.util.ArrayList; 4 import java.util.Collections; 5 6 import org.junit.Test; 7 8 9 10 public class CollectionTest { 11 @Test 12 public void test(){ 13 //这里都用英文名字是为了看字符串的排序 14 Student stu1 = new Student("alsa", 21); 15 Student stu3 = new Student("foas", 17); 16 Student stu4 = new Student("mike", 25); 17 Student stu6 = new Student("zieka", 17); 18 Student stu2 = new Student("dava", 24); 19 Student stu5 = new Student("nose", 14); 20 21 ArrayList<Student> list = new ArrayList<Student>(); 22 list.add(stu1); 23 list.add(stu2); 24 list.add(stu3); 25 list.add(stu4); 26 list.add(stu5); 27 list.add(stu6); 28 System.out.println("排序前"); 29 for(Student l:list){ 30 System.out.println(l); 31 } 32 System.out.println("排序后"); 33 Collections.sort(list); 34 for(Student l:list){ 35 System.out.println(l); 36 } 37 } 38 39 40 }
1 package Comparable; 2 3 class Student implements Comparable<Object>{ 4 String name; 5 int age; 6 7 public Student(String name, int age) { 8 super(); 9 this.name = name; 10 this.age = age; 11 } 12 13 public String getName() { 14 return name; 15 } 16 17 public void setName(String name) { 18 this.name = name; 19 } 20 21 public int getAge() { 22 return age; 23 } 24 25 public void setAge(int age) { 26 this.age = age; 27 } 28 29 @Override 30 public String toString() { 31 return "Student [name=" + name + ", age=" + age + "]"; 32 } 33 34 @Override 35 public int compareTo(Object o) { 36 // TODO Auto-generated method stub 37 if(((Student)o).age>age){ 38 return 1; 39 }else if(((Student)o).age<age){ 40 return -1; 41 }else{ 42 return ((Student)o).name.compareTo(name); 43 } 44 45 } 46 47 }
1 package ComparatorTest; 2 3 import java.util.Arrays; 4 import java.util.Comparator; 5 6 import org.junit.Test; 7 8 class MyComparator1 implements Comparator<Object>{ 9 10 @Override 11 public int compare(Object o1, Object o2) { 12 // TODO Auto-generated method stub 13 if(((Student)o1).age>((Student)o2).age){ 14 return 1; 15 }else if(((Student)o1).age<((Student)o2).age){ 16 return -1; 17 }else{ 18 return ((Student)o1).name.compareTo(((Student)o2).name); 19 } 20 } 21 22 } 23 24 public class ArraysTest { 25 @SuppressWarnings("unchecked") 26 @Test 27 public void test(){ 28 Student stu1 = new Student("alsa", 21); 29 Student stu3 = new Student("foas", 17); 30 Student stu4 = new Student("mike", 25); 31 Student stu6 = new Student("zieka", 17); 32 Student stu2 = new Student("dava", 24); 33 Student stu5 = new Student("nose", 14); 34 35 Student[] student = {stu1,stu2,stu3,stu4,stu5,stu6}; 36 System.out.println("排序前"); 37 for(int i = 0;i<student.length;i++){ 38 System.out.println(student[i]); 39 } 40 Arrays.sort(student,new MyComparator1()); 41 System.out.println("排序后"); 42 for(int i = 0;i<student.length;i++){ 43 System.out.println(student[i]); 44 } 45 } 46 }
1 package ComparatorTest; 2 3 4 import java.util.ArrayList; 5 import java.util.Collections; 6 import java.util.Comparator; 7 8 import org.junit.Test; 9 10 @SuppressWarnings("rawtypes") 11 class MyComparator implements Comparator{ 12 13 @Override 14 public int compare(Object o1, Object o2) { 15 // TODO Auto-generated method stub 16 if(((Student)o1).age>((Student)o2).age){ 17 return 1; 18 }else if(((Student)o1).age<((Student)o2).age){ 19 return -1; 20 }else{ 21 return ((Student)o1).name.compareTo(((Student)o2).name); 22 } 23 } 24 25 } 26 27 public class CollectionTest { 28 @SuppressWarnings("unchecked") 29 @Test 30 public void test(){ 31 //这里都用英文名字是为了看字符串的排序 32 Student stu1 = new Student("alsa", 21); 33 Student stu3 = new Student("foas", 17); 34 Student stu4 = new Student("mike", 25); 35 Student stu6 = new Student("zieka", 17); 36 Student stu2 = new Student("dava", 24); 37 Student stu5 = new Student("nose", 14); 38 39 ArrayList<Student> list = new ArrayList<Student>(); 40 list.add(stu1); 41 list.add(stu2); 42 list.add(stu3); 43 list.add(stu4); 44 list.add(stu5); 45 list.add(stu6); 46 System.out.println("排序前"); 47 for(Student l:list){ 48 System.out.println(l); 49 } 50 System.out.println("排序后"); 51 Collections.sort(list, new MyComparator()); 52 for(Student l:list){ 53 System.out.println(l); 54 } 55 } 56 57 58 }
1 package ComparatorTest; 2 3 public class Student { 4 String name; 5 int age; 6 7 public Student(String name, int age) { 8 super(); 9 this.name = name; 10 this.age = age; 11 } 12 13 public String getName() { 14 return name; 15 } 16 17 public void setName(String name) { 18 this.name = name; 19 } 20 21 public int getAge() { 22 return age; 23 } 24 25 public void setAge(int age) { 26 this.age = age; 27 } 28 29 @Override 30 public String toString() { 31 return "Student [name=" + name + ", age=" + age + "]"; 32 } 33 34 }