[1-01-01].第43节:常用类 - 比较器类 Comparator接口
Java基础学习大纲
说明:
- 基本数据类型的数据(除boolean类型外)需要比较大小的话,之间使用比较运算符即可,
- 引用数据类型是不能直接使用比较运算符来比较大小的。那么,如何解决这个问题呢?使用两个接口中的任何一个:
Comparable
或Comparator
Comparator接口的使用:定制排序
2.1.Comparator接口介绍:
a.适用场景:
- 1.当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码(例如:一些第三方的类,你只有.class文件,没有源文件)
- 2.如果一个类,实现了Comparable接口,也指定了两个对象的比较大小的规则,但是此时此刻我不想按照它预定义的方法比较大小,但是我又不能随意修改,因为会影响其他地方的使用
b.Comparator源码:
- 1.在compare(Object o1,Object o2)方法,
比较的是两个对象o1和o2的大小
,若返回整数,o1大,返回0一样大,返回-1是O2大
package java.util;
public interface Comparator{int compare(Object o1,Object o2);
}
2.2.Comparator接口介绍:
- JDK在设计类库之初,也考虑到上面所说的情况,所以又增加了一个java.util.Comparator接口,强行对多个对象进行整体排序的比较
- 重写compare(Object o1,Object o2)方法,比较o1和o2的大小:如果方法返回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示o1小于o2
- 可以将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort),从而允许在排序顺序上实现精确控制
2.3.代码测试:
a.测试1:把字符串从大到小的顺序排列:
public void test3(){String []arr = new String[]{"aa","ff","cc","bb","gg","zz"};Arrays.sort(arr,new Comparator(){//按照字符串从大到小的顺序排列@Overridepublic int compare(Object o1, Object o2) {if(o1 instanceof String && o2 instanceof String){String s1 = (String) o1;String s2 = (String) o2;return -s1.compareTo(s2);}throw new RuntimeException("传入的参数异常.数据类型不一致");}});//输出arr
}
b.测试2:自定义类实现按照商品名从小到大,再按照价格从高到低的顺序排列:
@Test
public void test4(){Good [] arr = new Good[4];arr[0] = new Good("klk",1.2f);arr[1] = new Good("jf",2.2f);arr[2] = new Good("trgr",0.2f);arr[3] = new Good("gryt",11.2f);Arrays.sort(arr,new Comparator(){@Overridepublic int compare(Object o1, Object o2) {if(o1 instanceof Good && o2 instanceof Good){Good g1 = (Good) o1;Good g2 = (Good) o2;if (g1.getName().equals(g2.getName())){return - Double.compare(g1.getPrice(),g2.getPrice());}else{return g1.getName().compareTo(g2.getName());}}throw new RuntimeException("参数异常");}});System.out.println(Arrays.toString(arr));
}