在寒假的时候就有很多人问算法上的Arrays.sort()排序,我那个时候就告诉他们就是把数组进行从小到大的排序,这对于一般的算法题确实就是这样,因为用不到多少。但是Arrays.sort()的用法远不止于此,下面主要说的是一维二维数组。
一维数组
1、Arrays.sort(int[] a)
这种形式是对一个数组的所有元素进行排序,并且是按从小到大的顺序。也就是平常的算法题中简单的对于数组进行排序
2、Arrays.sort(int[] a, int fromIndex, int toIndex)
这种形式是对数组部分排序,也就是对数组a的下标从fromIndex到toIndex-1的元素排序,注意:下标为toIndex的元素不参与排序哦!
3、public static void sort(T[] a,int fromIndex,int toIndex, Comparator c)
上面有一个拘束,就是排列顺序只能是从小到大,如果我们要从大到小,就要使用这种方式
这里的Comparator就不讲那么细了,就是java.util里的一个第三方工具类,下面附上用法代码
在这里我直接用new对象来完成了
Arrays.sort(int[] a,2,3,new Comparator
public int compare(int a,int b){
if(a
return 1;
}else if(a>b){
return -1;
}else{return 0;}
}
});
当然你也可以写的更加优美层次
Arrays.sort(int[] a,2,3,new myComparator());
myComparator肯定是继承了Comparator接口所以请实现myComparator类
class myComparator implements Comparator{
public int compare(int a,int b){
if(a
return 1;
}else if(a>b){
return -1;
}else{return 0;}
}
}
下面的建议了解泛型再看
整个一维数组到这里就结束了,下面开始二位,一样接触泛型的应该容易理解,在二维的数组理解上可以多参照参照一维数组
Arrays.sort()重载了四类方法
sort(T[] a):对指定T型数组按数字升序排序。
sort(T[] a,int formIndex, int toIndex):对指定T型数组的指定范围按数字升序排序。
sort(T[] a, Comparator supre T> c): 根据指定比较器产生的顺序对指定对象数组进行排序。
sort(T[] a, int formIndex, int toIndex, Comparator supre T> c): 根据指定比较器产生的顺序对指定对象数组的指定对象数组进行排序。
这就是他的本来面目,所以说他不仅可以对数字数组进行操作,肯定还是可以对于一些对象进行一些操作
前面两个不用多说,看一维数组的就行,后面的可以对二维进行更高功能的探索
二维数组
sort(T[] a, Comparator supre T> c): 根据指定比较器产生的顺序对指定对象数组进行排序。
(1)按第一维元素比较二维数组
直接看代码
import java.util.Arrays;
import java.util.Comparator;
public class ArraysSort {
public static void main(String[] args) {
int[][] nums=newint[][]{{1,3},{1,2},{4,5},{3,7}};
Arrays.sort(nums,newComparator(){
public int compare(int[] a,int[] b){
if(a[0]==b[0]){
return a[1]-b[1];
}else{
return a[0]-b[0];
}
}
});
}
}
运行结果:
[1, 2]
[1, 3]
[3, 7]
[4, 5]
(2)按第二维元素比较二维数组
import java.util.Arrays;
import java.util.Comparator;
public class ArraysSort {
public static void main(String[] args) {
int[][] nums=newint[][]{{1,3},{1,2},{4,5},{3,7}};
Arrays.sort(nums,newComparator(){
public int compare(int[] a,int[] b){
if(a[1]==b[1]){
return a[0]-b[0];
}else{
return a[1]-b[1];
}
}
});
}
}
运行结果
[1, 2]
[1, 3]
[4, 5]
[3, 7]
既然参数是泛型就在举一个不是很常见的数字数组,就用java中的对象来进一步诉说
import java.util.Arrays;
import java.util.Comparator;
class Dog{
int size;
int weight;
public Dog(int s,int w){
size = s;
weight = w;
}
}
class DogSizeComparator implements Comparator{
@Override
public int compare(Dog o1, Dog o2) {
return o1.size - o2.size;
}
}
class DogWeightComparato rimplements Comparator{
@Override
public int compare(Dog o1, Dog o2) {
return o1.weight - o2.weight;
}
}
public class ArraysSort {
public static void main(String[] args) {
Dog d1 =newDog(2, 50);
Dog d2 =newDog(1, 30);
Dog d3 =newDog(3, 40);
Dog[] dogArray = {d1, d2, d3};
printDogs(dogArray);
Arrays.sort(dogArray, new DogSizeComparator());
printDogs(dogArray);
Arrays.sort(dogArray, new DogWeightComparator());
printDogs(dogArray);//方法在后面别迷糊
}
public static void printDogs(Dog[] dogs){
for(Dog d: dogs)
System.out.print("size="+d.size + " weight=" + d.weight + " ");
System.out.println();
}
}
// 结果/*size=2 weight=50 size=1 weight=30 size=3 weight=40
size=1 weight=30 size=2 weight=50 size=3 weight=40
size=1 weight=30 size=3 weight=40 size=2 weight=50 */
sort(T[] a, int formIndex, int toIndex, Comparator supre T> c)根据指定比较器产生的顺序对指定对象数组的指定对象数组进行排序。
***这个就简单举个例子理解一下吧,因为和上面比也没什么特殊的,就是中间多的两个参数是是对数组的范围进行约束,可以看看刚才的一维数组
import java.util.Arrays;
import java.util.Comparator;
public class ArraysSort {
public static void main(String[] args) {
int[][] nums=new int[][]{{1,3},{1,2},{4,5},{3,7}};
Arrays.sort(nums,2,4,new Comparator(){
@Override
public int compare(int[] a,int[] b){
if(a[0]==b[0]){
return a[1]-b[1];
}else{
return a[0]-b[0];
}
}
});
}
}