个人笔记,以免遗忘,JAVA小白,敬请指点~~
关于Array.sort()有三种格式,如下:
1.sort(Objetc[] a)来进行对象的自然排序,该对象必需实现Compareable接口,重写compareableTo方法,并一般在此方法中定义这3种返回值(1,0,-1)来进行排序标准的确认,后续关于返回值的正负会进行说明。而让对象实现Compareable接口的方式,称为内部比较器。 2.sort(T[] a, Comparator>? super T<> c)当调用此方法来进行自定义数组排序时,需要我们指定外部比较器。第二个参数就是自定义的比较器类,这个类必须继承Comparator接口并实现compare方法,于是就对T[]按照自定义的比较器规则进行排序。 3.sort(Object[] a, int fromIndex, int toIndex)这种形式是对数组部分排序,也就是对数组a的下标从fromIndex到toIndex-1的元素排序,注意:下标为toIndex的元素不参与排序哦!
第一种格式的使用范例: 1.对基本类型进行排序可以直接传入基本类型数组 eg.整型数组:
int[] a=new int[]{0,1,2,3,4,5,6}; //升序排列 Arrays.sort(a); System.out.println("升序排列: "+Arrays.toString(a));输出:升序排列: [0, 1, 2, 3, 4, 5, 6]
可以看到默认是进行升序排列,如果要对数组进行降序排列,你可以把它反转了,或者自定义一个Comparator类(使用的是sort的第二种格式,传入一个外部比较器,可以看后续讲解,这里超前说一下),这里用匿名内部类展示了一下降序排列的写法。值得注意的是,Comparator用于构造基本数据类型的比较器时,只能对基本类型的包装类进行排序,也就是说只能传入包装类的数组,这里我们需要首先把int[]转为Integer[]
int[] a=new int[]{0,1,2,3,4,5,6}; //降序排列 Integer[] array = new Integer[a.length]; for(int i=0; i<a.length; i++) { Integer integer = new Integer(a[i]); array[i] = integer; } Arrays.sort(array,new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { // TODO Auto-generated method stub return (int)(o2-o1); } }); System.out.println("降序排列: "+Arrays.toString(array));输出:降序排列: [6, 5, 4, 3, 2, 1, 0]
2.对String数组排序:
String[] strArray = new String[]{"Zs","ZA","ZAO", "aa", "Az","D","w","A","z"}; Arrays.sort(strArray); System.out.println(Arrays.toString(strArray));输出:[A, Az, D, ZA, ZAO, Zs, aa, w, z] 可以看到这种比较方式是按照每一个字符的ascii码进行比较的,第一位ascii码大的在后面,如果第一位一样就比较第二位,第二位大的在后面。
!如果要不区分大小写对String数组排序
String[] strArray = new String[]{"Zs","ZA","ZAO", "aa", "Az","D","w","A","z"}; Arrays.sort(strArray ,String.CASE_INSENSITIVE_ORDER); System.out.println(Arrays.toString(strArray));输出:[A, aa, Az, D, w, z, ZA, ZAO, Zs] 3.对类类型数组
对类类型进行排序,有两种方式一个是用内部比较器一个是用外部比较器,直接调用sort(Objetc[] a)的方式叫做内部比较,但是这个类类型必须实现了Compareable接口的compareableTo方法,举例如下:
package uestc.leetcode.za; public class Student1 implements Comparable{ String name; int age; int id; int score; public Student1(){ } public Student1(String name,int age,int id,int score){ this.name=name; this.age=age; this.id=id; this.score=score; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getId() { return id; } public void setId(int id) { this.id = id; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } @Override public int compareTo(Object o) { if(o instanceof Student1){ Student1 st=(Student1)o; return this.age-st.age; } return 0; } @Override public String toString() { return "Student1 [name=" + name + ", age=" + age + ", id=" + id + ", score=" + score + "]"+"\n"; } }测试类中:
Student1[] stu=new Student1[4]; stu[0]=new Student1("张三",10,1,92); stu[1]=new Student1("小明",13,2,100); stu[2]=new Student1("王丽",11,3,98); stu[3]=new Student1("李四",12,4,94); Arrays.sort(stu); System.out.println(Arrays.toString(stu));输出: [Student1 [name=张三, age=10, id=1, score=92] , Student1 [name=王丽, age=11, id=3, score=98] , Student1 [name=李四, age=12, id=4, score=94] , Student1 [name=小明, age=13, id=2, score=100] ] compareTo方法中对Student1类中的age进行了比较,该类有三种输出结果,正、0、负,如果想降序排列只需要将return this.age-st.age;改为return st.age - this.age;
return 正数 时,按照从小到大排序return 0 时,原位置不动return 负数 时,按照从大到小排序第二种格式的使用范例: 1.以匿名内部类的方式定义一个比较器,如上一种格式中对int[]的降序排序的举例。 2.定义一个类实现Comparator接口,实现compare方法:
class SortById implements Comparator<Student1>{ @Override public int compare(Student1 o1, Student1 o2) { // TODO Auto-generated method stub return o1.id-o2.id; }主函数:
Arrays.sort(stu,new SortById()); System.out.println(Arrays.toString(stu));输出: [Student1 [name=张三, age=10, id=1, score=92] , Student1 [name=小明, age=13, id=2, score=100] , Student1 [name=王丽, age=11, id=3, score=98] , Student1 [name=李四, age=12, id=4, score=94] ]
可以看到这个例子是按照id进行升序排列。外部比较器的优点是可以对于类类型数组进行多种规则的排序,比如我这里想对Student1[]进行id的升序又想score的降序,那就定义两种类型的外部比较器,排序两次即可。如果只是用内部比较器,就只能有一种排序规则,这是外部比较器相比于内部比较器的一个优点。 这里还值得注意的是,我并没有更改Student1这个类,也就是这个类还是实现了Comparable的compareTo方法,也就是上面提到的按照age排序,但是当我用外部比较器(比较id)的时候,sort方法不会按照内部比较器规则排序,而是会按照外部比较器的规则进行排序。 第三种格式的使用范例: 还是拿整型数组举例:
int[] b=new int[]{55,86,95,8,6,3,47,12}; Arrays.sort(b, 1, 5); System.out.println(Arrays.toString(b)+"b的长度为"+b.length);输出: [55, 6, 8, 86, 95, 3, 47, 12]b的长度为8
sort(Object[] a, int fromIndex, int toIndex)这是一种对数组局部排序的方法,排序范围为[fromIndex,toIndex)包含左端点不右端点。如果写成:Arrays.sort(b, 0, b.length);就是对整个数组排序了。这种方法也是可以对类类型排序的,内部比较器外部比较器均适用。
二维数组每一行有两个元素,可能一个元素表示的是序号另一个为值,经常就会有要求要对序号进行排序或者对值进行排序。也就是说要求我们对二维数组利用第i列的元素进行排列,如果对第0列的元素进行升序排列,如下:
nt[][] temp=new int[][]{{1,5},{2,4},{3,6},{4,9}}; Arrays.sort(temp, new Comparator<int[]>(){ @Override public int compare(int[] o1, int[] o2) { // TODO Auto-generated method stub return o1[0]-o2[0]; }}); for(int i=0;i<temp.length;i++){ System.out.println(Arrays.toString(temp[i])); }输出: [1, 5] [2, 4] [3, 6] [4, 9] 如果对第1列元素升序排列只需要return o1[1]-o2[1];
感谢观看,以上~