比较器比较对象数组Comparable和Comparator区别

如果对对象数组进行排序,那么就应该指定类中属性进行比较,比如手机比较,可以比较手机价格大小,所以这个时候就需要实现java.lang.Comparable接口,而这个接口的定义如下:

public interface Comparable<T> {

    public int compareTo(T o) ;

}

这个时候对于返回值只有三种:1(大于)、0(等于)、-1(小于)。

代码实现:

 1 package cn.demo;
 2 import java.util.Arrays;
 3 class Phone implements Comparable<Phone>{
 4     private String brand;
 5     private double price;
 6     public Phone(String brand,double price){
 7         this.brand = brand;
 8         this.price = price;
 9     }
10 
11     public String toString() {
12         return "品牌:" + this.brand + ",价格:" +this.price+"\n";
13     }
14 public int compareTo(Phone o){
15     if(this.price > o.price){
16         return 1;
17     }else if(this.price < o.price){
18         return -1;
19     }else{
20         return 0;
21     }
22 }
23 }
24 public class Test{
25     public static void main(String[] args) {
26         Phone [] phones = new Phone[]{
27                 new Phone("黑莓" ,999.99),
28                 new Phone("白菜", 19.99),
29                 new Phone("大白",799.99)};
30         Arrays.sort(phones);
31         System.out.println(Arrays.toString(phones));
32         }
33     }

输出结果:

[品牌:白菜,价格:19.99
, 品牌:大白,价格:799.99
, 品牌:黑莓,价格:999.99
]

以后只要是见到数组排序(程序类自动的处理),那么不需要思索,直接使用Comparable。

***************************************************************************************************************************

突然有一天你忽然发现需要对这个类的对象进行对象数组排序,但是你又不能够去修改这个类。

如果现在类本身不具备排序的支持,那么可以直接使用java.util.Comparator接口实现排序规则的设置,等于你现在需要有一个单独的类负责排序规则的指定。在Comparator接口里面提供有如下的两个方法:

  · 对象相等比较:public boolean equals(Object obj);

  · 对象大小比较:public int compare(T o1, T o2)。

范例:定义一个单独的比较规则类

 1 package cn.demo;
 2 
 3 import java.util.Arrays;
 4 import java.util.Comparator;
 5 
 6 class Phone{
 7     private String brand;
 8     private double price;
 9     public Phone(String brand,double price){
10         this.brand = brand;
11         this.price = price;
12     }
13 
14     public String getBrand() {
15         return brand;
16     }
17 
18     public void setBrand(String brand) {
19         this.brand = brand;
20     }
21 
22     public double getPrice() {
23         return price;
24     }
25 
26     public void setPrice(double price) {
27         this.price = price;
28     }
29 
30     public String toString() {
31         return "品牌:" + this.brand + ",价格:" +this.price+"\n";
32     }
33 }
34 class PhoneComparator implements Comparator<Phone>{
35     public int compare(Phone o1,Phone o2)    {
36     if(o1.getPrice() > o2.getPrice()){
37             return 1;
38         }else if(o1.getPrice() < o2.getPrice()){
39             return -1;
40         }else{
41             return 0;
42         }
43     }
44 }
45 public class Test{
46     public static void main(String[] args) {
47         Phone [] phones = new Phone[]{
48                 new Phone("黑莓" ,999.99),
49                 new Phone("白菜", 19.99),
50                 new Phone("大白",799.99)
51                 };
52     
53         Arrays.sort(phones,new PhoneComparator());
54         System.out.println(Arrays.toString(phones));
55         }
56}

面试题:请解释Comparable和Comparator的区别?

· 如果要进行对象数组的比较处理,那么必须有比较器的支持,比较器有两个:Comparable、Comoparator;

· java.lang.Comparable是在类定义的时候实现好的接口,里面只定义有一个compareTo()方法;

· java.util.Comparator属于挽救的比较器接口,需要单独定义一个比较规则类,里面有一个compare()方法,在JDK 1.8开始将其定义为函数式接口。

posted on 2016-08-24 15:45  麦牧嘉禾  阅读(796)  评论(0编辑  收藏  举报

导航