Comparable和Comparator
一、Comparable比较类:
1.为什么需要这个类:
java中的对象,正常情况下,只能进行比较:== 或 !=,不能使用<、>来进行比较。但是在实际开发中,又需要对多个对象进行排序,言外之意,就需要比较对象的大小。所以就要通过两个定义的接口之一来实现:Comparable或Comparator
2.Coparable接口的使用:
①像String、包装类等实现了Comparable接口,重写了compareTo(obj)方法,给出了比较两个对象的方式。
②像String、包装类重写了compareTo()方法后。进行了从小到大的排列。
③重写compareTo(obj)的规则:
- 如果当前对象this大于形参对象obj,则返回正整数。
- 如果当前对象this小于形参对象obj,则返回负整数。
- 如果当前对象this等于形参对象obj,则返回零。
代码如下:
public class Comeper { @Test public void tests(){ String[] arr = new String[]{"AA","BB","CC","GG","DD"}; Arrays.sort(arr); System.out.println(Arrays.toString(arr)); }//结果就是AA,BB,CC,DD,GG
④对于自定义类来说,如果需要排序,可以让自定义类实现Comparable接口,重写ComparaTo()。
代码如下:
@Override public int compareTo(Object o) {//按照价格排序重写 if (o instanceof Plan){ Plan gg = (Plan)o; if (this.price > gg.price){ return 1; }else if (this.price < gg.price){ return -1; }else { return 0; } } throw new RuntimeException("传的什么值,不能比!"); } //toString重写省略 @Test public void teste(){ Plan[] miaosha = new Plan[4]; miaosha[0] = new Plan("dell",2500); miaosha[1] = new Plan("hesisi",3600); miaosha[2] = new Plan("motelola",200); miaosha[3] = new Plan("apple",8000); Arrays.sort(miaosha); System.out.println(Arrays.toString(miaosha)); }
二、Comparator接口的使用:定制排序
适用场景:当元素的类型没有实现java.lang.Comparable接口又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那么可以考虑使用Comparator的对象来排序。
@Test public void teset(){ String[] arr = new String[]{"AA","BB","CC","GG","DD"}; Arrays.sort(arr, new Comparator() {//匿名实现类对象 @Override public int compare(Object o1, Object o2) { if (o1 instanceof String && o2 instanceof String){ String ww = (String)o1; String ss = (String)o2; return -ww.compareTo(ss); } throw new RuntimeException("类型错误!"); } }); System.out.println(Arrays.toString(arr)); }
三、Comparable接口和Comparator的使用比较对比:
Comparable接口的方式一旦一定,保证Comparable接口实现类的对象在任何位置都可以比较大小
Comparator接口属于临时性的比较
犹豫是必然的,结果却是偶然的。