posts - 39,  comments - 263,  trackbacks - 0

          排序的算法是我們最常用的算法,初學程序,每個人都嘗試過排序。但只是局限于簡單的排序。
          如將下列數字進行排序
          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分別表示姓,名,性別,年齡。


          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

          下面是要實現比較器


          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。

          再嘗試輸出結果看看


          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]);
          ? }


          ? }

          }

          輸出結果:

          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


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


          ?

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

          FeedBack:
          # re: 比較器Comparator
          2006-05-28 04:14 | 潛心
          支持下  回復  更多評論
            
          # re: 比較器Comparator
          2006-05-30 18:10 | 貝隆夫人
          其實你寫的不錯,就是太麻煩了
          我該了,你那些功能只要導入一個包 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]);
          }
          }
          }
            回復  更多評論
            
          # re: 比較器Comparator
          2006-06-05 14:38 | tohu
          hehe,不錯,簡與繁,知其然知其所以然,good,
          感謝樓主和貝隆夫人。。。  回復  更多評論
            
          # re: 比較器Comparator[未登錄]
          2008-06-17 00:18 | a
          太高深了 我看不懂 收藏備用  回復  更多評論
            
          # re: 比較器Comparator[未登錄]
          2010-09-28 13:16 | 天行者
          三樓是高人呀~呵呵~  回復  更多評論
            

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


          網站導航:
           
          <2006年5月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          常用鏈接

          留言簿(18)

          我參與的團隊

          隨筆檔案(39)

          收藏夾(1)

          搜索

          •  

          積分與排名

          • 積分 - 451355
          • 排名 - 119

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 无锡市| 安平县| 广灵县| 兴文县| 顺义区| 本溪| 林周县| 博湖县| 开江县| 开远市| 全州县| 炉霍县| 泰安市| 彩票| 梅州市| 沁水县| 伊吾县| 宣城市| 昭苏县| 滨海县| 惠水县| 建平县| 兴山县| 九龙城区| 福鼎市| 昌宁县| 咸阳市| 佛教| 大宁县| 海阳市| 靖江市| 桓台县| 昆山市| 灌云县| 吉林省| 华坪县| 济阳县| 肥东县| 平谷区| 元谋县| 蚌埠市|