Java自定义比较器实现中文排序
compareTo方法
compareTo()是两个字符串对象比较大小,返回一个整数值,如果调用字符串对象大,返回正整数,反之,返回负整数。相等则返回0。compareTo()是两个字符串对象按ASCII比较大小(汉字是Unicode),返回一个整数值,如果调用字符串对象大,返回正整数,反之,返回负整数。相等则返回0。
Comparator比较器
Java内实现自定义比较器比较简单,实现Comparator接口的compare()这个方法来制定排序规则,按照Java规范应满足以下约定,否则会抛Comparisonmethodviolatesitsgeneralcontract异常。规则如下:
同时应满足以下约定:
自反性sgn(compare(x,y))==-sgn(compare(y,x))
传递性compare(x,y)>0compare(y,z)>0)=>得出compare(x,z)>0
一致性(compare(x,y)==0)==(x.equals(y)),这点规范中原文是“notstrictlyrequired”,不是必须的,但是实现者应该知道不一致的后果,所以尽量实现这一要求.
Comparatorcomparator=newComparator (){ @Override publicintcompare(Strings1,Strings2){ returns1.compareTo(s2); } };
以下代码示例:
@Test publicvoidtestCompare(){ Listlist=newArrayList<>(); list.add("java"); list.add("php"); list.add("c++"); System.out.println("排序前-->"+list); Comparator comparator=newComparator (){ @Override publicintcompare(Strings1,Strings2){ returns1.compareTo(s2); } }; Collections.sort(list,comparator); System.out.println("排序后-->"+list); Collections.reverse(list); System.out.println("排序后逆序-->"+list); }
Comparator中文排序
中文汉字是Unicode编码,所以排序时不是我们习惯用的拼音字母。如果还是刚才的实现,代码如下:
@Test publicvoidtestCompareCN(){ Listlist=newArrayList<>(); list.add("中国");//中->20013unicode编码的4E2D list.add("英国");//英-->33521unicode编码的82F1 list.add("美国");//美->32654unicode编码的7F8E //汉字unicode编码表http://www.chi2ko.com/tool/CJK.htm System.out.println("排序前-->"+list); Comparator comparator=newComparator (){ @Override publicintcompare(Strings1,Strings2){ intb=s1.compareTo(s2); returnb; } }; Collections.sort(list,comparator); System.out.println("排序后-->"+list); Collections.reverse(list); System.out.println("排序后逆序-->"+list); //输出字符编码对应的十进制 //chara='美'; //System.out.println((int)a); }
输出的这个结果不符合我们的排序习惯,因此应该用Collator指定Locale.CHINA,代码应如下:
@Test publicvoidtestCollator(){ Listlist=newArrayList<>(); list.add("中国"); list.add("英国"); list.add("美国"); System.out.println("排序前-->"+list); Collections.sort(list,newComparator (){ @Override publicintcompare(Strings1,Strings2){ Stringo1=""; Stringo2=""; if(s1!=null){ o1=s1; } if(s2!=null){ o2=s2; } Collatorinstance=Collator.getInstance(Locale.CHINA); returninstance.compare(o1,o2); } }); System.out.println("排序后-->"+list); Collections.reverse(list); System.out.println("排序后逆序-->"+list); }
值得注意的是,compareTo不能传入null,自定义比较器时要注意。
补充知识:Java使用比较器对TreeSet进行自定义排序
比较器是个很方便的工具
一般定义格式为
publicstaticclass类名implementsComparator{ @Override publicintcompare(Objecto1,Objecto2){ //TODOAuto-generatedmethodstub returno1-o2;//升序 //returno2-o1;降序 } }
对于一个类来说,比如图书类,定义一个比较器之后,就可以对图书类的价格属性进行排序,升序降序都可以。也可以对图书类的名字进行排序。
在创建集合类的时候传入一个比较器对象,系统就会识别比较器中的方法了。
例如:
TreeSet
treeset=newTreeSet (newMyComparator());
下面是使用TreeSet集合+比较器对图书类价格实现的升序排序
packagetest; importjava.util.Comparator; importjava.util.TreeSet; publicclass比较器的使用{ publicstaticclassBook{ Stringname; intprice; publicBook(Stringname,intprice){ this.name=name; this.price=price; } @Override publicStringtoString(){ //TODOAuto-generatedmethodstub return"Book:"+name+"Price:"+price; } } /** * *@authorAdministrator *升序比较器,降序只要将b1,b2换个顺序即可 */ publicstaticclassMyComparatorimplementsComparator{ @Override publicintcompare(Objecto1,Objecto2){ //TODOAuto-generatedmethodstub Bookb1=(Book)o1; Bookb2=(Book)o2; returnb1.price-b2.price; } } publicstaticvoidmain(String[]args){ TreeSettreeset=newTreeSet (newMyComparator()); treeset.add(newBook("动物世界",50)); treeset.add(newBook("时间简史",25)); treeset.add(newBook("探索发现",60)); treeset.add(newBook("恐龙时代",20)); System.out.println(treeset); } }
以上这篇Java自定义比较器实现中文排序就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。