Java中实现Comparable和Comparator对象比较
当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序。
Acomparisonfunction,whichimposesatotalorderingonsomecollectionofobjects.Comparatorscanbepassedtoasortmethod(suchasCollections.sortorArrays.sort)toallowprecisecontroloverthesortorder.Comparatorscanalsobeusedtocontroltheorderofcertaindatastructures(suchassortedsetsorsortedmaps),ortoprovideanorderingforcollectionsofobjectsthatdon'thaveanaturalordering.------API
对字符串List可以直接sort进行排序,那是因为String这个对象已经帮我们实现了Comparable接口,所以我们的Person如果想排序,也要实现一个比较器。
一.Comparator
对Linkedlist存储的对象进行排序
importjava.util.Comparator;
importjava.util.LinkedList;
classPerson{
privatefloatheight;
privateStringname;
Person(floatheight)
{
this.height=height;
}
publicfloatgetHeight(){
returnheight;
}
publicvoidsetHeight(floatheight){
this.height=height;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
}
classPersonHeightimplementsComparator<Person>{
@Override
//重写compare方法,return<0不变,return>0则交换顺序(保持升序)
publicintcompare(Persone1,Persone2){
if(e1.getHeight()<e2.getHeight()){
return1;
}else{
return-1;
}
}
}
publicclassQuestion3{
publicstaticvoidmain(String[]args){
Personp1=newPerson(23.4f);
p1.setName("Stud1");
Personp2=newPerson(2.34f);
p2.setName("Stud2");
Personp3=newPerson(34.32f);
p3.setName("Stud3");
Personp4=newPerson(56.45f);
p4.setName("Stud4");
Personp5=newPerson(21.4f);
p5.setName("Stud5");
LinkedList<Person>al=newLinkedList<Person>();
al.add(p1);
al.add(p2);
al.add(p3);
al.add(p4);
al.add(p5);
//调用sort方法,实现排序
Collections.sort(al,newPersonHeight());
//遍历输出
for(Personp:al)
System.out.println(p.getName());
}
}
附加:
//对日期进行排序
/**
*如果o1小于o2,返回一个负数;如果o1大于o2,返回一个正数;如果他们相等,则返回0;
*/
@Override
publicintcompare(Stepo1,Stepo2){
DateacceptTime1=UtilTool.strToDate(o1.getAcceptTime(),null);
DateacceptTime2=UtilTool.strToDate(o2.getAcceptTime(),null);
//对日期字段进行升序,如果欲降序可采用before方法
if(acceptTime1.after(acceptTime2))return1;
return-1;
}
二.Comparable
importjava.util.Collections;
importjava.util.Comparator;
importjava.util.LinkedList;
classPersonimplementsComparable{
privatefloatheight;
privateStringname;
Person(floatheight)
{
this.height=height;
}
publicfloatgetHeight(){
returnheight;
}
publicvoidsetHeight(floatheight){
this.height=height;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
@Override
publicintcompareTo(Objecto){
//TODOAuto-generatedmethodstub
if(this.height>((Person)o).height){
return1;
}else
return-1;
}
}
publicclassQuestion3{
publicstaticvoidmain(String[]args){
Personp1=newPerson(23.4f);
p1.setName("Stud1");
Personp2=newPerson(2.34f);
p2.setName("Stud2");
Personp3=newPerson(34.32f);
p3.setName("Stud3");
Personp4=newPerson(56.45f);
p4.setName("Stud4");
Personp5=newPerson(21.4f);
p5.setName("Stud5");
LinkedList<Person>al=newLinkedList<Person>();
al.add(p1);
al.add(p2);
al.add(p3);
al.add(p4);
al.add(p5);
Collections.sort(al);
for(Personp:al)
System.out.println(p.getName());
}
}
三.比较
Comparable定义在Person类的内部。
Comparator是定义在Person的外部的,此时我们的Person类的结构不需要有任何变化。
两种方法各有优劣,用Comparable简单,只要实现Comparable接口的对象直接就成为一个可以比较的对象,但是需要修改源代码,用Comparator的好处是不需要修改源代码,而是另外实现一个比较器,当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了,并且在Comparator里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。