compare

更新时间:2022-11-26 07:46:30 阅读: 评论:0


2022年11月26日发(作者:北京软件工程师培训)

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

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会报空指针异常

Listbooks=newArrayList<>();

(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新增的接⼝,挑⼏个放进去----------*/

//返回反向排序⽐较器

defaultComparatorreverd(){

eOrder(this);

}

//根据名字知道,先进⾏compare⽐较后,再进⾏⼀次⽐较

defaultComparatorthenComparing(Comparator<?superT>other){

eNonNull(other);

return(Comparator&Serializable)(c1,c2)->{

intres=compare(c1,c2);

return(res!=0)?res:e(c1,c2);

};

}

//对int类型的key进⾏⽐较

publicstaticComparatorcomparingInt(ToIntFunction<?superT>keyExtractor){

eNonNull(keyExtractor);

return(Comparator&Serializable)

(c1,c2)->e(sInt(c1),sInt(c2));

}

//返回正常顺序的⽐较器

publicstatic>ComparatornaturalOrder(){

return(Comparator)CE;

}

}

⼀起来看⼀下如何使⽤,先来看⼀下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类型可以⾃定义各种排序

TreeMaptreeMap=newTreeMap<>((Stringa,Stringb)->eTo(a));//降序

TreeMaptreeMap=newTreeMap<>((Stringa,Stringb)->eTo(b));//升序

TreeMap的按value排序(转换成entrylist然后排序)汉字是按ascii码排序的,不是汉语拼⾳

Personp1=newPerson(1,"A⼩红");

Personp2=newPerson(5,"D赵明");

Personp3=newPerson(2,"W孙宇");

Personp4=newPerson(9,"C黎明");

TreeMaptreeMap=newTreeMap<>();

("45",p1);

("12",p2);

("85",p3);

("33",p4);

List<>entries=newArrayList<>(et());

(entries,

(e1,e2)->((Person)ue()).getPersonName()

.compareTo(((Person)ue()).getPersonName()));

n("按名字顺序排列");

for(Entryentry:entries){

n(ue());

}

本文发布于:2022-11-26 07:46:30,感谢您对本站的认可!

本文链接:http://www.wtabcd.cn/fanwen/fan/90/23764.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:remained
下一篇:late
标签:compare
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图