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);
Comparatorcomparator=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);
Comparatorcomparator=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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。