算法笔记:自定义排序 Comparator
在做算法题时经常需要排序,java提供Arrays.sort(),但是默认只能从小到大排序一维数组,如果想排序二维数组,或者自定义排序规则:从小到大、字符串排序规则等,需要传入Comparator接口并实现里面的compare方法。
compare方法
返回值int
参数:T o1,T o2
返回正数则正序,否则逆序。
例1:从大到小排序
import org.junit.Test;
import java.util.Arrays;
import java.util.Comparator;
public class Sort {
@Test
public void comparator1(){
Integer[] arr={1,2,1,3,4,8,7};
Arrays.sort(arr,new Comparator<Integer>(){
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;//从大到小 快排 如果是o1-o2从小到大
}
});
for (int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
}
必须是对包装类数组或者多维数组自定义排序,int没办法自定义排序。
o1-o2>0,则交换两个数,否则不变,同理o2-o1你可以在纸上画一画,试一下,注意不是快排!(之前写的快排,纠正,对于非基本类型不是快排,sort自动选择用插入排序或归并排序看哪个效率高)。
【宫水三叶の相信科学系列】为什么根据「拼接结果的字典序大小」决定「其在序列里的相对
例2:对二维数组排序
public void comparator2(){
int[][] arr={{1,2},{2,3},{3,4},{1,3}};
Arrays.sort(arr,new Comparator<int[]>(){
@Override
public int compare(int[] o1, int[] o2) {
return o1[1]-o2[1];//按下标1的大小排序 从小到大
}
});
for (int i=0;i<arr.length;i++){
for(int j=0;j<arr[0].length;j++) {
System.out.print(arr[i][j] + " ");
}
}
}
例3:对字符串排序compareTo
public void comparator3(){
String[] arr={"10","11","3","0","5"};
Arrays.sort(arr,new Comparator<String>(){
@Override
public int compare(String o1, String o2) {
return (o2+o1).compareTo(o1+o2);//从大到小排 例:"510" "105"返回正值交换
}
});
for (int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
compareTo作用: 返回参与比较的前后两个字符串的asc码的差值,如果两个字符串首字母不同,则该方法返回首字母的asc码的差值。
对大数排序
有大数的时候不要用减号,用大于、小于就好了,不然越界!
public void comparator2(){
int[][] arr={{1,2},{2,3},{3,4},{1,3}};
Arrays.sort(arr,new Comparator<int[]>(){
@Override
public int compare(int[] o1, int[] o2) {
if(o1[1]>=o2[1])
return 1;
else return -1;
//按下标1的大小排序 从小到大
}
});
for (int i=0;i<arr.length;i++){
for(int j=0;j<arr[0].length;j++) {
System.out.print(arr[i][j] + " ");
}
}
}
可以自测一下
剑指 Offer 45. 把数组排成最小的数