如果对对象数组进行排序,那么就应该指定类中属性进行比较,比如手机比较,可以比较手机价格大小,所以这个时候就需要实现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+" "; 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+" "; 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开始将其定义为函数式接口。