1.问题
例如arr = [13,2,41,62,36,624,25]这样一个数组,在解决问题的过程,有时候我们需要将获得这个数组从大到小排序,而库中自带的方法是Arrays.sort(arr),但是其实现的是数组从小到大排序
2.分析
然后就想使用重载方法sort(T[] a, Comparator<? super T> c) 方法作用:根据指定的比较器引发的顺序对指定的对象数组进行排序
然后就爆出如下错误。
原因是定义数组的时候用的是基本数据类型int,只要将基本数据类型改成对应的包装类就可以了。
还可以使用另一种方法,Arrays.sort(arr3, Collections.reverseOrder()),其中Collections.reverseOrder()的作用是返回一个比较器,它对实现Comparble接口的对象集合施加了自然排序的相反。
3.代码实现
@Test
public void test1() {
Integer[] arr1 = {13,2,41,62,36,624,25};
Arrays.sort(arr1, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
System.out.println("arr1= " + Arrays.toString(arr1));
Integer[] arr2 = {13,2,41,62,36,624,25};
// 使用lambda表达式简化流程
Arrays.sort(arr2,(o1,o2) -> {
return o2 - o1;
});
System.out.println("arr2= " + Arrays.toString(arr2));
Integer[] arr3 = {13,2,41,62,36,624,25};
// 使用lambda表达式简化流程
Arrays.sort(arr3, Collections.reverseOrder());
System.out.println("arr3= " + Arrays.toString(arr3));
}
@Test
public void test2() {
String[] strArray1 = new String[]{"Z", "a", "D"};
Arrays.sort(strArray1);
System.out.println("strArray1= " + Arrays.toString(strArray1));
String[] strArray2 = new String[]{"Z", "a", "D"};
// 字符串排序(忽略大小写),String.CASE_INSENSITIVE_ORDER就是返回一个忽略大小写的比较器
Arrays.sort(strArray2, String.CASE_INSENSITIVE_ORDER);
System.out.println("strArray2= " + Arrays.toString(strArray2));
}
优先队列的反转
PriorityQueue<Integer> queue = new PriorityQueue<>((a, b) -> b - a);