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里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。