Comparable和Comparator接口的使用
一、Comparable接口,需要某一个类实现该接口,接口中复写comparaTo(<T> o)方法,自己写比较规则,示例代码如下
Person类,实现了Comparable接口,复写了comparaTo方法
1 package cn.gao.day1019; 2 3 public class Person implements Comparable<Person> { 4 private String name; 5 private int age; 6 private double weight; 7 private double height; 8 9 public Person() { 10 } 11 12 public Person(String name, int age, double weight, double height) { 13 this.name = name; 14 this.age = age; 15 this.weight = weight; 16 this.height = height; 17 } 18 19 public String getName() { 20 return name; 21 } 22 23 public void setName(String name) { 24 this.name = name; 25 } 26 27 public int getAge() { 28 return age; 29 } 30 31 public void setAge(int age) { 32 this.age = age; 33 } 34 35 public double getWeight() { 36 return weight; 37 } 38 39 public void setWeight(double weight) { 40 this.weight = weight; 41 } 42 43 public double getHeight() { 44 return height; 45 } 46 47 public void setHeight(double height) { 48 this.height = height; 49 } 50 51 @Override 52 public String toString() { 53 return "Person{" + 54 "name='" + name + '\'' + 55 ", age=" + age + 56 ", weight=" + weight + 57 ", height=" + height + 58 '}'; 59 } 60 61 @Override 62 public int compareTo(Person o) { 63 if(this.age<o.age){ 64 return -1; 65 } 66 else if (this.age>o.age){ 67 return 1; 68 } 69 return 0; 70 } 71 }
在测试类中,如果要排序该类型的数组,可以直接调用Arrays.sort()方法,即可实现按自己写的规则排序。
1 package cn.gao.day1019; 2 3 import java.util.Arrays; 4 5 public class PersonDemo1 { 6 public static void main(String[] args) { 7 Person[] per = {new Person("zhangsan",20,75.5,165.5), 8 new Person("lisi",25,88.5,193.4), 9 new Person("wangwu",18,60.5,175.7), 10 new Person("zhaoliu",23,72.4,181.2), 11 new Person("chenqi",16,53.5,162.5)}; 12 Arrays.sort(per); 13 for (Person person : per) { 14 System.out.println(person); 15 } 16 } 17 }
打印结果如下:可以看到按照comparaTo()中的柜子,按照年龄的升序进行了排列。
Person{name='chenqi', age=16, weight=53.5, height=162.5}
Person{name='wangwu', age=18, weight=60.5, height=175.7}
Person{name='zhangsan', age=20, weight=75.5, height=165.5}
Person{name='zhaoliu', age=23, weight=72.4, height=181.2}
Person{name='lisi', age=25, weight=88.5, height=193.4}
二、Comparator需要根据不同属性的比较,分别写不同的实现类。
Person类不变,还是上面的原样,按Age比较的类如下
1 package cn.gao.day1019; 2 3 import java.util.Comparator; 4 5 /** 6 * 实现按age排序的类 7 */ 8 public class PersonSortByAge implements Comparator<Person> { 9 @Override 10 public int compare(Person o1, Person o2) { 11 if (o1.getAge() < o2.getAge()) { 12 return -1; 13 } else if (o1.getAge() > o2.getAge()) { 14 return 1; 15 } 16 return 0; 17 } 18 }
按Height比较的类如下
1 package cn.gao.day1019; 2 3 import java.util.Comparator; 4 5 /** 6 * 实现按height比较的类 7 */ 8 public class PersonSortByHeight implements Comparator<Person> { 9 @Override 10 public int compare(Person o1, Person o2) { 11 if (o1.getHeight() < o2.getHeight()) { 12 return -1; 13 } else if (o1.getHeight() > o2.getHeight()) { 14 return 1; 15 } 16 return 0; 17 } 18 }
按Weight比较的类如下
1 package cn.gao.day1019; 2 3 import java.util.Comparator; 4 5 /** 6 * 实现按weight比较的类 7 */ 8 public class PersonSortByWeight implements Comparator<Person> { 9 @Override 10 public int compare(Person o1, Person o2) { 11 if (o1.getWeight() < o2.getWeight()) { 12 return -1; 13 } else if (o1.getWeight() > o2.getWeight()) { 14 return 1; 15 } 16 return 0; 17 } 18 }
测试类如下
1 package cn.gao.day1019; 2 3 import java.util.Arrays; 4 import java.util.Comparator; 5 6 public class PersonDemo2 { 7 public static void main(String[] args) { 8 Person[] per = {new Person("zhangsan", 20, 75.5, 165.5), 9 new Person("lisi", 25, 88.5, 193.4), 10 new Person("wangwu", 18, 60.5, 175.7), 11 new Person("zhaoliu", 23, 72.4, 181.2), 12 new Person("chenqi", 16, 53.5, 162.5)}; 13 System.out.println("按age排序"); 14 Arrays.sort(per, new PersonSortByAge()); 15 for (Person person : per) { 16 System.out.println(person); 17 } 18 System.out.println("按height排序"); 19 Arrays.sort(per, new PersonSortByHeight()); 20 for (Person person : per) { 21 System.out.println(person); 22 } 23 System.out.println("按weight排序"); 24 Arrays.sort(per, new PersonSortByWeight()); 25 for (Person person : per) { 26 System.out.println(person); 27 } 28 } 29 }
执行结果如下:
按age排序
Person{name='chenqi', age=16, weight=53.5, height=162.5}
Person{name='wangwu', age=18, weight=60.5, height=175.7}
Person{name='zhangsan', age=20, weight=75.5, height=165.5}
Person{name='zhaoliu', age=23, weight=72.4, height=181.2}
Person{name='lisi', age=25, weight=88.5, height=193.4}
按height排序
Person{name='chenqi', age=16, weight=53.5, height=162.5}
Person{name='zhangsan', age=20, weight=75.5, height=165.5}
Person{name='wangwu', age=18, weight=60.5, height=175.7}
Person{name='zhaoliu', age=23, weight=72.4, height=181.2}
Person{name='lisi', age=25, weight=88.5, height=193.4}
按weight排序
Person{name='chenqi', age=16, weight=53.5, height=162.5}
Person{name='wangwu', age=18, weight=60.5, height=175.7}
Person{name='zhaoliu', age=23, weight=72.4, height=181.2}
Person{name='zhangsan', age=20, weight=75.5, height=165.5}
Person{name='lisi', age=25, weight=88.5, height=193.4}
可以看出,结果已经分别按age、height、weight进行了排序
总结:Comparable接口,实现该接口后,需要实现接口中的comparaTo方法,自身实现了排序,就可以和基本数据类型数组一样,使用Arrays.sort()方法进行排序了,传递参数为要排序的数组对象。只能定义一种比较规则,如果比较规则发生改变,那么就需要改动comparaTo()方法内的内容。
Comparator接口,该接口是单独的一个类去实现,即提前准备好不同参数的比较方法,有几套方法,就提前写接个比较的类,也可以后期扩展比较的类。排序时,也调用Arrays.sort(),但是传递的参数除了数组对象外,还要传递一个比较器对象。
Comparable接口较为单一,如果比较的参数固定,不存在多种情况,那么采用这种方法即可,只需要类里面实现comparaTo()方法,调用时直接传递待排序数组即可。
Comparable接口是预定义几种排序的类,同时后期可以根据业务扩展更多的排序类,扩展性强,调用时除了待排序的方法,还要传递排序类对象。