JAVA对象比较器Comparator

http://muscle-liu.iteye.com/blog/157261


排序的算法是我们最常用的算法,初学程序,每个人都尝试过排序。但只是局限于简单的排序。
如将下列数字进行排序
1,3,5,8,3,6
于是我们得出结果
1,3,3,5,6,8
将下列字母(字符)进行排序
a,i,e,f,w,s
于是我们得出结果
a,e,f,i,s,w
但是我们遇到的情况就不是如此简单了。如给公司里的商品进行排序,我们很轻易的想到按照商品的名称排序不就完了,而且简单明了。但现实并如我们相信般简单。同一商品名称可以有不同的批次,进货时间,可能还会有单价的不同。显然只根据商品名称排序是不合理的。

再举个简单例子然后用程序实现。如公司要将员工进行排序(不要说领导排在前面),假设我们的需求比较复杂。先进行姓排序,谁的姓拼音靠前,谁就排前面。然后对名字进行排序。恩.如果同名,女性排前头。如果名字和性别都相同,年龄小的排前头。ok,一个也不算复杂的需求。

如果对java比较熟悉的会知道java.util.Comparator 接口。要实现里面的函数
int compare(Object o1, Object o2) 返回一个基本类型的整型,返回负数表示o1 小于o2,返回0 表示o1和o2相等,返回正数表示o1大于o2。

于是我们设计的人员类要有几个变量,firstname,lastname,sex,age分别表示姓,名,性别,年龄。

Java代码 收藏代码
  1. publicclassPerson{
  2. Stringfirstname,lastname;
  3. Booleansex;
  4. Integerage;
  5. publicPerson(Stringfirstname,Stringlastname,Booleansex,Integerage){
  6. this.firstname=firstname;
  7. this.lastname=lastname;
  8. this.sex=sex;
  9. this.age=age;
  10. }
  11. publicStringgetFirstName(){
  12. returnfirstname;
  13. }
  14. publicStringgetLastName(){
  15. returnlastname;
  16. }
  17. publicBooleangetSex(){
  18. returnsex;
  19. }
  20. publicIntegergetAge(){
  21. returnage;
  22. }
  23. //为了输入方便,重写了toString()
  24. publicStringtoString()
  25. {
  26. returnfirstname+""+lastname+""+(sex.booleanValue()?"男":"女")+""+age;
  27. }
  28. }
  29. //endperson


下面是要实现比较器

Java代码 收藏代码
  1. publicclassComparators{
  2. publicstaticjava.util.ComparatorgetComparator(){
  3. returnnewjava.util.Comparator(){
  4. publicintcompare(Objecto1,Objecto2){
  5. if(o1instanceofString){
  6. returncompare((String)o1,(String)o2);
  7. }elseif(o1instanceofInteger){
  8. returncompare((Integer)o1,(Integer)o2);
  9. }elseif(o1instanceofPerson){
  10. returncompare((Person)o1,(Person)o2);
  11. }else{
  12. System.err.println("未找到合适的比较器");
  13. return1;
  14. }
  15. }
  16. publicintcompare(Stringo1,Stringo2){
  17. Strings1=(String)o1;
  18. Strings2=(String)o2;
  19. intlen1=s1.length();
  20. intlen2=s2.length();
  21. intn=Math.min(len1,len2);
  22. charv1[]=s1.toCharArray();
  23. charv2[]=s2.toCharArray();
  24. intpos=0;
  25. while(n--!=0){
  26. charc1=v1[pos];
  27. charc2=v2[pos];
  28. if(c1!=c2){
  29. returnc1-c2;
  30. }
  31. pos++;
  32. }
  33. returnlen1-len2;
  34. }
  35. publicintcompare(Integero1,Integero2){
  36. intval1=o1.intValue();
  37. intval2=o2.intValue();
  38. return(val1<val2?-1:(val1==val2?0:1));
  39. }
  40. publicintcompare(Booleano1,Booleano2){
  41. return(o1.equals(o2)?0:(o1.booleanValue()==true?1:-1));
  42. }
  43. publicintcompare(Persono1,Persono2){
  44. Stringfirstname1=o1.getFirstName();
  45. Stringfirstname2=o2.getFirstName();
  46. Stringlastname1=o1.getLastName();
  47. Stringlastname2=o2.getLastName();
  48. Booleansex1=o1.getSex();
  49. Booleansex2=o2.getSex();
  50. Integerage1=o1.getAge();
  51. Integerage2=o2.getAge();
  52. return(compare(firstname1,firstname2)==0?
  53. (compare(lastname1,lastname2)==0?(compare(sex1,sex2)==0?(compare(age1,age2)==0?0:
  54. compare(age1,age2)):
  55. compare(sex1,sex2)):
  56. compare(lastname1,lastname2)):
  57. compare(firstname1,firstname2));
  58. }
  59. };
  60. }
  61. }

以上代码有可能因为浏览器的布局自动换行。
compare(Person o1, Person o2)的返回值看起来比较别扭。最简单的是
Java代码 收藏代码
  1. publicintcompare(Booleano1,Booleano2){
  2. return(o1.equals(o2)?0:(o1.booleanValue()==true?1:-1));
  3. }


o1和o2相等返回0,否则o1如果是true 就表示o1大于o2。

再尝试输出结果看看


Java代码 收藏代码
  1. publicclassMain{
  2. publicMain(){
  3. }
  4. publicstaticvoidmain(String[]args){
  5. Person[]person=newPerson[]{
  6. newPerson("ouyang","feng",Boolean.TRUE,newInteger(27)),
  7. newPerson("zhuang","gw",Boolean.TRUE,newInteger(27)),
  8. newPerson("zhuang","gw",Boolean.FALSE,newInteger(27)),
  9. newtext.Person("zhuang","gw",Boolean.FALSE,newInteger(2)),
  10. };
  11. for(inti=0;i<person.length;i++){
  12. System.out.println("beforesort="+person[i]);
  13. }
  14. java.util.Arrays.sort(person,Comparators.getComparator());
  15. for(inti=0;i<person.length;i++){
  16. System.out.println("aftersort="+person[i]);
  17. }
  18. }
  19. }

输出结果:

Java代码 收藏代码
  1. beforesort=ouyangfeng男27
  2. beforesort=zhuanggw男27
  3. beforesort=zhuanggw女27
  4. beforesort=zhuanggw女2
  5. aftersort=ouyangfeng男27
  6. aftersort=zhuanggw女2
  7. aftersort=zhuanggw女27
  8. aftersort=zhuanggw男27

仔细理解java的Comparator会给你写排序带来很大帮助

文章来自: http://hi.baidu.com/zgz0809/blog/item/fdc65e16f1c4181b962b43e1.html

你可能感兴趣的:(comparator)