排序的算法是我们最常用的算法,初学程序,每个人都尝试过排序。但只是局限于简单的排序。 
如将下列数字进行排序 
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代码  

Java范围比较工具类 java比较器comparator_string

    1. public class
    2. String firstname,lastname;  
    3. Boolean sex;  
    4. Integer age;  
    5. public
    6. this.firstname = firstname;  
    7. this.lastname = lastname;  
    8. this.sex = sex;  
    9. this.age = age;  
    10. }  
    11. public
    12. return
    13.    }  
    14.   
    15. public
    16. return
    17.    }  
    18. public
    19. return
    20.     }  
    21.   
    22. public
    23. return
    24.     }  
    25.   
    26. //为了输入方便,重写了toString()
    27. public
    28.     {  
    29. return firstname +" "+lastname+" "+(sex.booleanValue()?"男":"女")+" "+age;  
    30.     }  
    31. }  
    32. //end person




    下面是要实现比较器 



    Java代码  

    Java范围比较工具类 java比较器comparator_string

    1. public class
    2. public static
    3. return new
    4.   
    5. public int
    6. if (o1 instanceof
    7. return
    8. else if (o1 instanceof
    9. return
    10. else if (o1 instanceof
    11. return
    12. else
    13. "未找到合适的比较器");  
    14. return 1;  
    15.   
    16.         }  
    17.       }  
    18.   
    19. public int
    20.         String s1 = (String) o1;  
    21.         String s2 = (String) o2;  
    22. int
    23. int
    24. int
    25. char
    26. char
    27. int pos = 0;  
    28.   
    29. while (n-- != 0) {  
    30. char
    31. char
    32. if
    33. return
    34.           }  
    35.           pos++;  
    36.         }  
    37. return
    38.       }  
    39.   
    40. public int
    41. int
    42. int
    43. return (val1 < val2 ? -1 : (val1 == val2 ? 0 : 1));  
    44.   
    45.       }  
    46. public int
    47.   
    48. return (o1.equals(o2)? 0 : (o1.booleanValue()==true?1:-1));  
    49.   
    50.        }  
    51.   
    52. public int
    53.         String firstname1 = o1.getFirstName();  
    54.         String firstname2 = o2.getFirstName();  
    55.         String lastname1 = o1.getLastName();  
    56.         String lastname2 = o2.getLastName();  
    57.         Boolean sex1 = o1.getSex();  
    58.         Boolean sex2 = o2.getSex();  
    59.         Integer age1 = o1.getAge();  
    60.         Integer age2 = o2.getAge();  
    61. return (compare(firstname1, firstname2) == 0
    62. 0 ? (compare(sex1, sex2) == 0 ? (compare(age1, age2) == 0 ? 0
    63.               compare(age1, age2)) :  
    64.               compare(sex1, sex2)) :  
    65.               compare(lastname1, lastname2)) :  
    66.               compare(firstname1, firstname2));  
    67.   
    68.       }  
    69.   
    70.     };  
    71. }  
    72.   
    73. }


    以上代码有可能因为浏览器的布局自动换行。 


    compare(Person o1, Person o2)的返回值看起来比较别扭。最简单的是 


    Java代码  

    Java范围比较工具类 java比较器comparator_string

    1. public int
    2.   
    3. return (o1.equals(o2)? 0 : (o1.booleanValue()==true?1:-1));  
    4.   
    5.  }



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



    再尝试输出结果看看 




    Java代码  

    Java范围比较工具类 java比较器comparator_string

    1. public class
    2. public
    3. }  
    4. public static void
    5. new
    6. new Person("ouyang", "feng", Boolean.TRUE, new Integer(27)),  
    7. new Person("zhuang", "gw", Boolean.TRUE, new Integer(27)),  
    8. new Person("zhuang", "gw", Boolean.FALSE, new Integer(27)),  
    9. new text.Person("zhuang", "gw", Boolean.FALSE, new Integer(2)),  
    10.   
    11.   
    12.      };  
    13. for (int i = 0; i < person.length; i++) {  
    14. "before sort="
    15.      }  
    16.      java.util.Arrays.sort(person, Comparators.getComparator());  
    17.   
    18. for (int i = 0; i < person.length; i++) {  
    19. "after sort="
    20.      }  
    21.   
    22.   
    23. }  
    24.   
    25. }



    输出结果: 



    Java代码  

    Java范围比较工具类 java比较器comparator_string


    1. before sort=ouyang feng 男 27
    2.   
    3. before sort=zhuang gw 男 27
    4.   
    5. before sort=zhuang gw 女 27
    6.   
    7. before sort=zhuang gw 女 2
    8.   
    9. after sort=ouyang feng 男 27
    10.   
    11. after sort=zhuang gw 女 2
    12.   
    13. after sort=zhuang gw 女 27
    14.   
    15. after sort=zhuang gw 男 27



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