<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 39,  comments - 263,  trackbacks - 0

    排序的算法是我們最常用的算法,初學(xué)程序,每個人都嘗試過排序。但只是局限于簡單的排序。
    如將下列數(shù)字進行排序
    1,3,5,8,3,6
    于是我們得出結(jié)果
    1,3,3,5,6,8
    將下列字母(字符)進行排序
    a,i,e,f,w,s
    于是我們得出結(jié)果
    a,e,f,i,s,w
    但是我們遇到的情況就不是如此簡單了。如給公司里的商品進行排序,我們很輕易的想到按照商品的名稱排序不就完了,而且簡單明了。但現(xiàn)實并如我們相信般簡單。同一商品名稱可以有不同的批次,進貨時間,可能還會有單價的不同。顯然只根據(jù)商品名稱排序是不合理的。

    再舉個簡單例子然后用程序?qū)崿F(xiàn)。如公司要將員工進行排序(不要說領(lǐng)導(dǎo)排在前面),假設(shè)我們的需求比較復(fù)雜。先進行姓排序,誰的姓拼音靠前,誰就排前面。然后對名字進行排序。恩.如果同名,女性排前頭。如果名字和性別都相同,年齡小的排前頭。ok,一個也不算復(fù)雜的需求。

    如果對java比較熟悉的會知道java.util.Comparator 接口。要實現(xiàn)里面的函數(shù)
    ?int compare(Object o1, Object o2) 返回一個基本類型的整型,返回負(fù)數(shù)表示o1 小于o2,返回0 表示o1和o2相等,返回正數(shù)表示o1大于o2。

    于是我們設(shè)計的人員類要有幾個變量,firstname,lastname,sex,age分別表示姓,名,性別,年齡。


    public class Person {
    ? String firstname,lastname;
    ? Boolean sex;
    ? Integer age;
    ? public Person(String firstname,String lastname,Boolean sex,Integer age) {
    ??? this.firstname = firstname;
    ??? this.lastname = lastname;
    ??? this.sex = sex;
    ??? this.age = age;
    ? }
    ? public String getFirstName() {
    ???? return firstname;
    ?? }

    ?? public String getLastName() {
    ???? return lastname;
    ?? }
    ?? public Boolean getSex() {
    ????? return sex;
    ??? }

    ??? public Integer getAge() {
    ????? return age;
    ??? }

    //為了輸入方便,重寫了toString()

    public String toString()
    ??? {
    ????? return firstname +" "+lastname+" "+(sex.booleanValue()?"男":"女")+" "+age;
    ??? }
    }
    //end person

    下面是要實現(xiàn)比較器


    public class Comparators {
    ? public static java.util.Comparator getComparator() {
    ??? return new java.util.Comparator() {

    ????? public int compare(Object o1, Object o2) {
    ??????? if (o1 instanceof String) {
    ????????? return compare( (String) o1, (String) o2);
    ??????? }
    ?????? else if (o1 instanceof Integer) {
    ????????? return compare( (Integer) o1, (Integer) o2);
    ??????? }

    ?????? else if (o1 instanceof Person) {
    ????? return compare( (Person) o1, (Person) o2);
    ??? }

    ??????? else {
    ????????? System.err.println("未找到合適的比較器");
    ????????? return 1;

    ??????? }
    ????? }

    ????? public int compare(String o1, String o2) {
    ??????? String s1 = (String) o1;
    ??????? String s2 = (String) o2;
    ??????? int len1 = s1.length();
    ??????? int len2 = s2.length();
    ??????? int n = Math.min(len1, len2);
    ??????? char v1[] = s1.toCharArray();
    ??????? char v2[] = s2.toCharArray();
    ??????? int pos = 0;

    ??????? while (n-- != 0) {
    ????????? char c1 = v1[pos];
    ????????? char c2 = v2[pos];
    ????????? if (c1 != c2) {
    ??????????? return c1 - c2;
    ????????? }
    ????????? pos++;
    ??????? }
    ??????? return len1 - len2;
    ????? }

    ????? public int compare(Integer o1, Integer o2) {
    ??????? int val1 = o1.intValue();
    ??????? int val2 = o2.intValue();
    ??????? return (val1 < val2 ? -1 : (val1 == val2 ? 0 : 1));

    ????? }
    ????? public int compare(Boolean o1, Boolean o2) {

    ???????? return (o1.equals(o2)? 0 : (o1.booleanValue()==true?1:-1));

    ?????? }

    ????? public int compare(Person o1, Person o2) {
    ??????? String firstname1 = o1.getFirstName();
    ??????? String firstname2 = o2.getFirstName();
    ??????? String lastname1 = o1.getLastName();
    ??????? String lastname2 = o2.getLastName();
    ??????? Boolean sex1 = o1.getSex();
    ??????? Boolean sex2 = o2.getSex();
    ??????? Integer age1 = o1.getAge();
    ??????? Integer age2 = o2.getAge();
    ??????? return (compare(firstname1, firstname2) == 0 ?
    ??????????????? (compare(lastname1, lastname2) == 0 ? (compare(sex1, sex2) == 0 ? (compare(age1, age2) == 0 ? 0 :
    ???????????????? compare(age1, age2)) :
    ???????????????? compare(sex1, sex2)) :
    ???????????????? compare(lastname1, lastname2)) :
    ??????????????? compare(firstname1, firstname2));

    ????? }

    ??? };
    ? }

    }
    以上代碼有可能因為瀏覽器的布局自動換行。
    compare(Person o1, Person o2)的返回值看起來比較別扭。最簡單的是

    ??? public int compare(Boolean o1, Boolean o2) {

    ???????? return (o1.equals(o2)? 0 : (o1.booleanValue()==true?1:-1));

    ?????? }

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

    再嘗試輸出結(jié)果看看


    public class Main {
    ? public Main() {
    ? }
    ? public static void main(String[] args) {
    ??? Person[] person = new Person[] {
    ???????? new Person("ouyang", "feng", Boolean.TRUE, new Integer(27)),
    ???????? new Person("zhuang", "gw", Boolean.TRUE, new Integer(27)),
    ???????? new Person("zhuang", "gw", Boolean.FALSE, new Integer(27)),
    ???????? new text.Person("zhuang", "gw", Boolean.FALSE, new Integer(2)),


    ???? };
    ???? for (int i = 0; i < person.length; i++) {
    ?????? System.out.println("before sort=" + person[i]);
    ???? }
    ???? java.util.Arrays.sort(person, Comparators.getComparator());
    ? for (int i = 0; i < person.length; i++) {
    ??? System.out.println("after sort=" + person[i]);
    ? }


    ? }

    }

    輸出結(jié)果:

    before sort=ouyang feng 男 27

    before sort=zhuang gw 男 27

    before sort=zhuang gw 女 27

    before sort=zhuang gw 女 2

    after sort=ouyang feng 男 27

    after sort=zhuang gw 女 2

    after sort=zhuang gw 女 27

    after sort=zhuang gw 男 27


    仔細(xì)理解java的Comparator會給你寫排序帶來很大幫助


    ?

    posted on 2006-05-27 17:20 nake 閱讀(2286) 評論(5)  編輯  收藏

    FeedBack:
    # re: 比較器Comparator
    2006-05-28 04:14 | 潛心
    支持下  回復(fù)  更多評論
      
    # re: 比較器Comparator
    2006-05-30 18:10 | 貝隆夫人
    其實你寫的不錯,就是太麻煩了
    我該了,你那些功能只要導(dǎo)入一個包 commons-lang
    package example.sort;

    import org.apache.commons.lang.builder.CompareToBuilder;


    public class Person implements Comparable
    {
    String firstname, lastname;

    Boolean sex;

    Integer age;

    public Person(String firstname, String lastname, Boolean sex, Integer age)
    {
    this.firstname = firstname;
    this.lastname = lastname;
    this.sex = sex;
    this.age = age;
    }

    public String getFirstName()
    {
    return firstname;
    }

    public String getLastName()
    {
    return lastname;
    }

    public Boolean getSex()
    {
    return sex;
    }

    public Integer getAge()
    {
    return age;
    }

    // 為了輸入方便,重寫了toString()

    public String toString()
    {
    return firstname + " " + lastname + " " + (sex.booleanValue() ? "男" : "女") + " " + age;
    }

    /**
    * @see java.lang.Comparable#compareTo(Object)
    */
    public int compareTo(Object object)
    {
    Person myClass = (Person) object;
    return new CompareToBuilder().append(this.lastname, myClass.lastname).append(this.firstname, myClass.firstname).append(this.sex, myClass.sex).append(this.age, myClass.age).toComparison();
    }
    }



    package example.sort;

    public class Main
    {
    public Main()
    {
    }

    public static void main(String[] args)
    {
    Person[] person = new Person[] { new Person("ouyang", "feng", Boolean.TRUE, new Integer(27)), new Person("zhuang", "gw", Boolean.TRUE, new Integer(27)),
    new Person("zhuang", "gw", Boolean.FALSE, new Integer(27)), new Person("zhuang", "gw", Boolean.FALSE, new Integer(2)),

    };
    for (int i = 0; i < person.length; i++)
    {
    System.out.println("before sort=" + person[i]);
    }
    java.util.Arrays.sort(person);
    for (int i = 0; i < person.length; i++)
    {
    System.out.println("after sort=" + person[i]);
    }
    }
    }
      回復(fù)  更多評論
      
    # re: 比較器Comparator
    2006-06-05 14:38 | tohu
    hehe,不錯,簡與繁,知其然知其所以然,good,
    感謝樓主和貝隆夫人。。。  回復(fù)  更多評論
      
    # re: 比較器Comparator[未登錄]
    2008-06-17 00:18 | a
    太高深了 我看不懂 收藏備用  回復(fù)  更多評論
      
    # re: 比較器Comparator[未登錄]
    2010-09-28 13:16 | 天行者
    三樓是高人呀~呵呵~  回復(fù)  更多評論
      

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    <2006年5月>
    30123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

    常用鏈接

    留言簿(18)

    我參與的團隊

    隨筆檔案(39)

    收藏夾(1)

    搜索

    •  

    積分與排名

    • 積分 - 451268
    • 排名 - 119

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 成人毛片免费播放| 亚洲日本中文字幕天堂网| 亚洲精品av无码喷奶水糖心| 国产大片免费观看中文字幕| 两个人看的www免费高清| 亚洲精品国产成人专区| 四虎免费大片aⅴ入口| 国产日韩久久免费影院| 亚洲婷婷综合色高清在线| 免费国产a国产片高清网站| 三年片在线观看免费| 亚洲熟妇AV一区二区三区宅男| 亚洲精品无码成人片在线观看 | 中文字幕无码播放免费| 香蕉视频在线观看免费| 亚洲一二成人精品区| 国产v片免费播放| 99热在线观看免费| 特级毛片aaaa免费观看| 亚洲AV无码一区二区三区人| 亚洲中文字幕久久精品无码APP| 97免费人妻无码视频| a级在线免费观看| 亚洲大尺度无码无码专线一区| 亚洲AV永久纯肉无码精品动漫| 精品少妇人妻AV免费久久洗澡| 久久久久国色av免费看| 老司机午夜在线视频免费观| 精品久久久久久亚洲精品| 婷婷亚洲久悠悠色悠在线播放| 亚洲第一区精品观看| 午夜视频免费成人| 18女人腿打开无遮掩免费| a级毛片100部免费观看| 男女猛烈xx00免费视频试看| 亚洲 日韩 色 图网站| 亚洲欧洲国产日韩精品| 亚洲综合AV在线在线播放| 四虎永久在线精品免费影视| 一二三四视频在线观看中文版免费| 黄色网址在线免费|