夜阑卧听风吹雨

人生苦短,我用python

导航

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接口是预定义几种排序的类,同时后期可以根据业务扩展更多的排序类,扩展性强,调用时除了待排序的方法,还要传递排序类对象。

posted on 2020-10-20 15:15  风之精灵  阅读(208)  评论(0)    收藏  举报