




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第Java使用lambda自定义Arrays.sort排序规则说明目录lambda自定义Arrays.sort排序规则1.类间排序2.使用比较器(comparator)作为sort的参数(用于单个类型的排序)补充一下Arrays.sort()的一些用法1.对指定T型数组按指定数值升序排序2.对指定T型数组的指定范围按指定数值升序排序3.根据指定比较器产生的顺序对指定对象数组进行排序
lambda自定义Arrays.sort排序规则
1.类间排序
首先注意默认排规则,当使用sort(Objetc[]a)来进行对象的自然排序,该对象必需实现Compareable接口,重写compareableTo方法,并一般在此方法中定义这3种返回值(1,0,-1)来进行排序标准的确认。
return1时,按照从小到大排序(也可以是2,3.....正数)return0时,原位置不动return-1时,按照从大到小排序
publicclassPersonimplementsComparableEmployee{
privateStringname;
privateintage;
publicPerson(){
publicPerson(Stringname,intage){
=name;
this.age=age;
*Comparespersonbyage
*@paramotheranotherPersonobject
*returnanegativevalueifthisemployeehasaloweragethan
*otherObject,0iftheagearethesame,apositivevalueotherwise
publicintcompareTo(Personother){
returnIpare(age,other.age);
}
2.使用比较器(comparator)作为sort的参数(用于单个类型的排序)
//正常方式
Arrays.sort(arr,newComparatorint[](){
publicintcompare(int[]a,int[]b){
returna[0]-b[0];
});
//lambda方式
Integer[]numsArr=newInteger[10];
Arrays.sort(numsArr,(x,y)-{
intsx=10,sy=10;
while(x=sx){
sx*=10;
while(y=sy){
sy*=10;
return(int)(sx*y+y-sy*x-x);
});
需要注意传入数组必须是对象类型
补充一下
注意:Arrays.sort()使用的是双轴快排:
1.对于很小的数组(长度小于27),会使用插入排序。
2.选择两个点P1,P2作为轴心,比如我们可以使用第一个元素和最后一个元素。
3.P1必须比P2要小,否则将这两个元素交换,现在将整个数组分为四部分:
(1)第一部分:比P1小的元素。
(2)第二部分:比P1大但是比P2小的元素。
(3)第三部分:比P2大的元素。
(4)第四部分:尚未比较的部分。
在开始比较前,除了轴点,其余元素几乎都在第四部分,直到比较完之后第四部分没有元素。
4.从第四部分选出一个元素a[K],与两个轴心比较,然后放到第一二三部分中的一个。
5.移动L,K,G指向。
6.重复45步,直到第四部分没有元素。
7.将P1与第一部分的最后一个元素交换。将P2与第三部分的第一个元素交换。
8.递归的将第一二三部分排序。
对于基本类型的数组如int[],double[],char[],Arrays类只提供了默认的升序排列,没有降序,需要传入自定义比较器,使用Arrays.sort(num,c),传入一个实现了Comparator接口的类的对象c。
逆序排列:
Arrays.sort(num,newComparatorInteger(){
publicintcompare(Integera,Integerb){
returnb-a;
});
Compare函数:
Comparesitstwoargumentsfororder.Returnsanegativeinteger,zero,orapositiveintegerasthefirstargumentislessthan,equalto,orgreaterthanthesecond.
1:前面的数后面的数,是降序(从大到小)排列,如果想要改为升序排列,就需要返回1-1:前面的数后面的数,是升序(从小到大)排列,不改变位置就返回-1;0:二者相等,不进行交换,也就不排序。但是要根据题目来判断返回什么。如果数组是无序的,不能直接返回0。若保证升序排列,要返回o1-o2,降序则o2-o1。
return0:不交换位置,不排序return1:交换位置return-1:不交换位置returno1-o2:升序排列returno2-o1:降序排列
compare方法中,写成returnpareTo(o2)或者returno1-o2表示升序;(2)写成returnpareTo(o1)或者returno2-o1表示降序
Arrays.sort()的一些用法
Arrays.sort()重载了四类方法
sort(T[]a):对指定T型数组按数字升序排序。sort(T[]a,intformIndex,inttoIndex):对指定T型数组的指定范围按数字升序排序。sort(T[]a,Comparatorc):根据指定比较器产生的顺序对指定对象数组进行排序。sort(T[]a,intformIndex,inttoIndex,Comparatorc):根据指定比较器产生的顺序对指定对象数组的指定对象数组进行排序。
参数说明:查看源码就知道重载的数据类型包括Object一共有八个,其他七个就是基本类型:int,long,short,char,byte,float,double.
1.对指定T型数组按指定数值升序排序
int[]ints=newint[]{12,4,6,7,2,8,3,9};//按数字
char[]chars=newchar[]{'a','c','b','i','+'};//按ascii码
byte[]bytes=newbyte[]{7,5,6,10,-1};//按字节数
Arrays.sort(ints);
Arrays.sort(chars);
Arrays.sort(bytes);
System.out.println(Arrays.toString(ints));
//结果:[2,3,4,6,7,8,9,12]
System.out.println(Arrays.toString(chars));
//结果:[+,a,b,c,i]
System.out.println(Arrays.toString(bytes));
//结果:[-1,5,6,7,10]
2.对指定T型数组的指定范围按指定数值升序排序
int[]ints=newint[]{12,4,6,7,2,8,3,9};//按数字
char[]chars=newchar[]{'a','c','b','i','+'};//按ascii码
byte[]bytes=newbyte[]{7,5,6,10,-1};//按字节数
Arrays.sort(ints,2,5);
Arrays.sort(chars,2,5);
Arrays.sort(bytes,2,5);
System.out.println(Arrays.toString(ints));
//结果:[12,4,2,6,7,8,3,9]
System.out.println(Arrays.toString(chars));
//结果:[a,c,+,b,i]
System.out.println(Arrays.toString(bytes));
//结果:[7,5,-1,6,10]
3.根据指定比较器产生的顺序对指定对象数组进行排序
(1)一维数组降序排序
这里用降序演示一下;
/*注意,要想改变默认的排列顺序,不能使用基本类型(int,double,char)
而要使用它们对应的包装类*/
Integer[]ints=newInteger[]{12,4,6,7,2,8,3,9};
Arrays.sort(ints,Collections.reverseOrder());
System.out.println(Arrays.toString(ints));
//结果:[12,9,8,7,6,4,3,2]
也可以使用自定义规则
Arrays.sort(ints,newComparatorInteger(){
@Override
publicintcompare(Integero1,Integero2){
returno2-o1;
}
//lambda表达式
Arrays.sort(ints,(o1,o2)-o2-o1);
(2)二维数组按一维数组排序升序
PS:这里提一下如果是Integer数组比较相等时用equals而不是用==。至于为什么请看==和equals的区别
int[][]nums=newint[][]{{1,3},{1,2},{5,1},{4,5},{3,3}};
//方法一
Arrays.sort(nums,newComparatorint[](){
@Override
publicintcompare(int[]a,int[]b){
//当第一维相等时比较第二维的
if(a[0]==b[0]){
returna[1]-b[1];
}else{
returna[0]-b[0];
}
}
//方法二,使用lambda表达式
Arrays.sort(nums,(a,b)-a[0]==b[0]a[1]-b[1]:a[0]-b[0]);
for(int[]num:nums){
System.out.print(Arrays.toString(num));
//结果:[1,2][1,3][3,3][4,5][5,1]
(3)二维数组按二维数组排序升序
int[][]nums=newint[][]{{1,3},{1,2},{5,1},{4,5},{3,3}};
//方法一
Arrays.sort(nums,newComparatorint[](){
@Override
publicintcompare(int[]a,int[]b){
//当第二维相等时比较第一维的
if(a[1]==b[1]){
returna[0]-b[0];
}else{
returna[1]-b[1];
}
}
//方法二,使用lambda表达式
Arrays.sort(nums,(a,b)-a[1]==b[1]
a[0]-b[0]:a[1]-b[1]);
for(int[]num:nums){
System.out.print(Arrays.toString(num));
//结果:[5,1][1,2][1,3][3,3][4,5]
(4)二维数组降序
对调返回值哪里的顺序
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 职场素养与职业道德试题及答案
- 2025年自考行政管理深入题目及答案
- 主管护师考试技巧与试题及答案
- 临床药学在病案分析中的应用试题及答案
- 2025年卫生资格考试各类资源试题及答案
- 行政管理实践案例分析试题及答案
- 深入浅出的卫生资格考试试题及答案
- 新疆昌吉州第二中学高一上学期期末考试历史试卷
- 自考行政管理全覆盖的试题与答案输出
- 导医工作内容培训
- 水质监测服务投标方案(技术标)
- 内容质量评价体系
- 2025年中考作文试题预测及范文
- 2023年高考真题-地理(河北卷) 含答案
- 2024年贵州六盘水市中考道德与法治试卷真题(含答案详解)
- DB50-T 1649-2024 餐饮业菜品信息描述规范
- GB/T 17775-2024旅游景区质量等级划分
- 2024-2030年中国冻干猫粮行业供需现状及未来投资效益盈利性研究报告
- 2024年东南亚数字办公场所软件市场深度研究及预测报告
- 2024年4月自考00055企业会计学试题及答案
- 空调维修规章制度
评论
0/150
提交评论