java中的compareto⽅法的详细介绍
⼀.java中的compareto⽅法
1.返回参与⽐较的前后两个字符串的asc码的差值,如果两个字符串⾸字母不同,则该⽅法返回⾸字母的asc码的差值
Stringa1="a";
Stringa2="c";
n(eTo(a2));//结果为-2
2.即参与⽐较的两个字符串如果⾸字符相同,则⽐较下⼀个字符,直到有不同的为⽌,返回该不同的字符的asc码差值,
Stringa1="aa";
Stringa2="ad";
n(eTo(a2));//结果为-3
3.如果两个字符串不⼀样长,可以参与⽐较的字符⼜完全⼀样,则返回两个字符串的长度差值
Stringa1="aa";
Stringa2="aa12345678";
n(eTo(a2));//结果为-8
4.返回为正数表⽰a1>a2,返回为负数表⽰a1
5.数字类型不能⽤compareTo,nt跟int的⽐较不能⽤compareTo⽅法,直接⽤⼤于(>)⼩于(<)或者等于(==)不等于(!=)来⽐较即可
intnum1=4;
intnum2=5;
eTo(num2);//CannotinvokecompareTo(int)ontheprimitivetypeint
你可以先把你的int型变量转换成String再进⾏⽐较
intnum1=4;
intnum2=5;
//parinttoString
n((num1+"").compareTo(num2+""));//-1
n(newInteger(num1).toString().compareTo(newInteger(num2).toString()));//-1
n(f(num1).compareTo(f(num2)));//-1
eToIgnoreCa忽略⼤⼩写
不考虑⼤⼩写,按字典顺序⽐较两个字符串。此⽅法返回⼀个整数,它的正负号是调⽤compareTo的正负号,调⽤时使⽤了字符串的规范
化版本,其⼤⼩写差异已通过对每个字符调⽤rCa(rCa(character))得以消除。
注意,此⽅法不考虑语⾔环境,因此可能在某些特定的语⾔环境中产⽣不理想的排序。包提供Collators来完成语⾔环境敏感的排
序。
型可以直接⽐较,所以没有⽤到compareTo⽐较,如果声明的是Date、String、Integer、或者其他的,可以直接使⽤compareTo⽐较,
Integern1=5;
Integern2=6;
n(eTo(n2));//-1
⼆.Comparable
compareTo⽅法内必须做⾮空判断(规范问题),当然int类型就不⽤了。
注意事项:
1、模型必须实现Comparable
2、(list)会⾃动调⽤compareTo,如果没有这句,list是不会排序的,也不会调⽤compareTo⽅法
3、如果是数组则⽤(a)⽅法
注意要⾮空判断,这⾥实例就不判断了
privateintbookId;
privateStringbookName;
privateintbookPrice;
@Override
publicintcompareTo(Booko){
//TODOAuto-generatedmethodstub
//ice;//按价格排序升序
//ice;//按价格排序降序
//eTo(me);//按书名排序升序
//先按id再按价格最后按书名排序升序
intresult=;
if(result==0){
result=ice;
}
if(result==0){
result=eTo(me);
}
returnresult;
}
e;
ist;
;
tions;
;
publicclassTestCompare{
publicstaticvoidmain(String[]args){
Bookb1=newBook(1,"语⽂",20);
Bookb2=newBook(2,"数学",10);
Bookb3=newBook(5,"英语",10);
Bookb4=newBook(4,"化学",50);
Bookb5=newBook(3,"化学",10);
//Bookb6=null;//不能为null,调⽤compareTo会报空指针异常
List
(b1);
(b2);
(b3);
(b4);
(b5);
n("Collections排序前");
for(Bookbook:books){
n(book);
}
(books);
n("Collections排序后");
for(Bookbook:books){
n(book);
}
Book[]b=newBook[5];
n();
b[0]=b1;
b[1]=b2;
b[2]=b3;
b[3]=b4;
b[4]=b5;
n("Arrays排序前");
for(Bookbook:b){
n(book);
}
(b);
n("Arrays排序后");
for(Bookbook:b){
n(book);
}
}
}
在应⽤中我们为了好判断状态,⼀般处理为
if(<){
return-1;
}elif(>){
return1;
}el{
return0;
}
返回值为1,0.-1:
三。Comparator接⼝
源码:
@FunctionalInterface
publicinterfaceComparator
//核⼼⽅法,⽤来⽐较两个对象,如果o1⼩于o2,返回负数;等于o2,返回0;⼤于o2返回正数
intcompare(To1,To2);
//好像很少⽤到,⼀般都⽤对象⾃带的equals
booleanequals(Objectobj);
/**-----------下⾯的都是JDK1.8新增的接⼝,挑⼏个放进去----------*/
//返回反向排序⽐较器
defaultComparator
eOrder(this);
}
//根据名字知道,先进⾏compare⽐较后,再进⾏⼀次⽐较
defaultComparator
eNonNull(other);
return(Comparator
intres=compare(c1,c2);
return(res!=0)?res:e(c1,c2);
};
}
//对int类型的key进⾏⽐较
publicstatic
eNonNull(keyExtractor);
return(Comparator
(c1,c2)->e(sInt(c1),sInt(c2));
}
//返回正常顺序的⽐较器
publicstatic
return(Comparator
}
}
⼀起来看⼀下如何使⽤,先来看⼀下JDK1.8以前的⽤法:
(books,newComparator
@Override
publicintcompare(Booko1,Booko2){
//TODOAuto-generatedmethodstub
kPrice()-kPrice();
}
});
或者创建⼀个⽐较器
e;
ator;
publicclassSimpleCompatorimplementsComparator
@Override
publicintcompare(Booko1,Booko2){
//TODOAuto-generatedmethodstub
kPrice()-kPrice();
}
}
(books,newSimpleCompator());
JDK1.8以前的⽤法要⾃⼰⼿动实现Comparator接⼝,然后调⽤(),传⼊实现类来完成排序,⾮常⿇烦,⽽JDK1.8则相对来说简
单了很多:
(books,(Booka,Bookb)->{kPrice()-kPrice();});
或者可以简单的写为
(books,(Booka,Bookb)->kPrice()-kPrice());
甚⾄,我们可以不使⽤:
((Booka,Bookb)->kPrice()-kPrice());
compator在treeMap中的应⽤(基于key的排序):
treeMap默认的是基于key的从⼩到⼤的排列
⾃定义排序也是基于key的,如果keyobject类型可以⾃定义各种排序
TreeMap
TreeMap
TreeMap的按value排序(转换成entrylist然后排序)汉字是按ascii码排序的,不是汉语拼⾳
Personp1=newPerson(1,"A⼩红");
Personp2=newPerson(5,"D赵明");
Personp3=newPerson(2,"W孙宇");
Personp4=newPerson(9,"C黎明");
TreeMap
("45",p1);
("12",p2);
("85",p3);
("33",p4);
List<
(entries,
(
.compareTo(((Person)ue()).getPersonName()));
n("按名字顺序排列");
for(Entry
n(ue());
}
本文发布于:2022-11-26 07:46:30,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/23764.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |