自定义比较器类,继承Comparator,在Array.sort()中传入值。
public class Solution {
public static void main ( String[ ] args) {
Integer[ ] arr = { 4 , 6 , 3 , 9 , 1 , 5 , 8 } ;
Mycomparator c = new Mycomparator ( ) ;
Arrays. sort ( arr, c) ;
for ( Integer ele : arr) {
System. out. print ( ele + " " ) ;
}
}
}
class Mycomparator implements Comparator < Integer> {
@Override
public int compare ( Integer o1, Integer o2) {
if ( o1 > o2)
return - 1 ;
if ( o1 < o2)
return 1 ;
return 0 ;
}
}
Arrays.sort(arr, c);,arr必须是Integer包装类数组。,但是Arrays.sort(arr);,arr可以是int数组,也可以是Integer数组。
1.对基本数据类型的数组的排序
说明:(1)Arrays类中的sort()使用的是“经过调优的快速排序法”;
(2)比如int[],double[],char[]等基数据类型的数组,Arrays类之只是提供了默认的升序排列,没有提供相应的降序排列方法。
(3)要对基础类型的数组进行降序排序,需要将这些数组转化为对应的封装类数组,如Integer[],Double[],Character[]等,对这些类数组进行排序。(其实还不如先进行升序排序,自己在转为将序)。
Arrays方法李提供了两个方法,一个是对int[]基本类型数组进行排序。一个是对Integer[]包装类型数组进行自定义排序。
int[]数组排序
Integer[]包装类自定义排序,这个方法主要用于自定义类的排序算法。
所以可以看出,Arrays.sort(arr, c);是对于包装类进行排序的,主要用于自定义排序。这也就是为什么Arrays有这么多的sort重载方法的原因。
public static void main ( String[ ] args) {
int [ ] arr = { 4 , 6 , 3 , 9 , 1 , 5 , 8 } ;
Mycomparator c = new Mycomparator ( ) ;
Arrays. sort ( arr, c) ;
}
对于自定义的类,你需要implements Comparable,重写compareTo方法
附,数组打印中 int[] 和Integer[]数组的区别
package lq;
import java. util. Arrays;
public class Solution {
public static void main ( String[ ] args) {
String names[ ] = { "Georgianna" , "Tenn" , "Simon" , "Tom" } ;
System. out. println ( Arrays. asList ( names) ) ;
System. out. println ( Arrays. asList ( new String [ ] { "Georgianna" , "Tenn" , "Simon" , "Tom" } ) ) ;
System. out. println ( Arrays. asList ( new Integer [ ] { 1 , 2 , 3 } ) ) ;
System. out. println ( Arrays. asList ( new int [ ] { 1 , 2 , 3 } ) ) ;
}
}
众所周知 String[]数组是一个对象数组,里面存储的是一个个String对象,
static <T> List<T> asList(T... a)
Returns a fixed-size list backed by the specified array.
这个是asList方法的方法签名!接受的参数为可变参数!,这个可变参数,是一个个泛型T,而这个T就是String,或者Integer。
因为new Integer[]{1,2,3}是一个对象数组,里面存储了三个T,也就是三个Integer对象,所以asList()方法认为数组中有三个元素。
但new int[]{1,2,3}是基本类型的数组,asList(T... a) 方法将整个数组对象看成一个元素,也就是看成一个Integer对象,但是这个对象是一个数组!并没有将里面的元素当成一个元素。
所以第二个只打印出一个数组对象地址!