聶永的博客

          記錄工作/學習的點點滴滴。

          JAVA 兩種排序方式復習

          本文演示了在一個java文件中集成了兩種排序方式,自定義冒泡排序算法進行區別于JDK的內置排序算法。
          傳統模式下的兩種排序算法:
          /**
          * JAVA兩種排序復習
          * 針對具體對象編寫相應的排序代碼,這一部分是經常變動的部分
          * 排序Arrays.sort方法為不變的部分,封裝了具體排序算法
          * 兩者結合,一個策略模式出來了
          *
          * @author xiaomin
          */

          public class Person implements Serializable, Comparable<Person> {
          private static final long serialVersionUID = -23536L;

          private String name;
          private int age;

          public Person() {
          }

          public Person(String name, int age) {
          this.name = name;
          this.age = age;
          }

          public String getName() {
          return name;
          }

          public void setName(String name) {
          this.name = name;
          }

          public int getAge() {
          return age;
          }

          public void setAge(int age) {
          this.age = age;
          }

          // 正序排列,針對具體bean的排序,經常變動的部分
          public int compareTo(Person o) {
          if (o == null)
          return -1;

          return this.getAge() < o.getAge() ? -1 : (this.getAge() == o.getAge() ? 0 : 1);
          }

          public String toString() {
          return "name : " + getName() + " age : " + getAge();
          }

          public static void main(String... args) {
          Person[] persons = { new Person("a", 12), new Person("b", 10),
          new Person("demo", 23), new Person("hello", 22),
          new Person("hello", 32) };

          System.out.println("排序前 ......");
          System.out.println(Arrays.toString(persons));

          System.out.println("排序后 ......");
          Arrays.sort(persons);
          System.out.println(Arrays.toString(persons));

          System.out.println("使用自定義排序 ......");

          // 適用于沒有繼承Comparable的bean或需要自行定制的排序方式
          Arrays.sort(persons, new Comparator<Person>() {
          public int compare(Person o1, Person o2) {// 倒敘排列
          return o1.getAge() > o2.getAge() ? -1 : (o1.getAge() == o2.getAge() ? 0 : 1);
          }
          });

          System.out.println(Arrays.toString(persons));
          }
          }

          一般還是建議使用JDK內置的排序算法,當然我們還是可以自己編寫自定義的排序算法,下面代碼僅僅為了演示。
          /**
          * 自定義冒泡排序算法,演示使用,用以替代系統默認的Arrays.sort
          * @author xiaomin
          *
          */

          public class BubbleSort {
          public static void main(String[] args) {
          Person[] persons = { new Person("a", 12), new Person("b", 10),
          new Person("demo", 23), new Person("hello", 22),
          new Person("hello", 32) };

          System.out.println("排序前 ......");
          System.out.println(Arrays.toString(persons));

          System.out.println("排序后 ......");
          bubble(persons);
          System.out.println(Arrays.toString(persons));

          System.out.println("使用自定義排序 ......");

          // 適用于沒有繼承Comparable的bean或需要自行定制的排序方式
          bubble(persons, new Comparator<Person>() {
          public int compare(Person o1, Person o2) {// 倒敘排列
          return o1.getAge() > o2.getAge() ? -1 : (o1.getAge() == o2.getAge() ? 0 : 1);
          }
          });

          System.out.println(Arrays.toString(persons));
          }

          public static <T> void bubble(T [] ts, Comparator<? super T> c){
          for(int i = 0; i < ts.length; i ++){
          for(int j = ts.length -1; j > i; j--){
          if(c.compare(ts[j-1], ts[j]) > 0){
          swap(ts, j-1, j);
          }
          }
          }
          }

          public static <T extends Comparable<T>> void bubble(T [] ts){
          for(int i = 0; i < ts.length; i ++){
          for(int j = ts.length -1; j > i; j--){
          if(ts[j-1].compareTo(ts[j]) > 0){
          swap(ts, j-1, j);
          }
          }
          }
          }

          private static <T> void swap(T [] ints,int index1, int index2){
          T temp = ints[index1];

          ints[index1] = ints[index2];

          ints[index2] = temp;
          }
          }
           
          兩種排序輸出結果:
          排序前 ......
          [name : a age : 12, name : b age : 10, name : demo age : 23, name : hello age : 22, name : hello age : 32]
          排序后 ......
          [name : b age : 10, name : a age : 12, name : hello age : 22, name : demo age : 23, name : hello age : 32]
          使用自定義排序 ......
          [name : hello age : 32, name : demo age : 23, name : hello age : 22, name : a age : 12, name : b age : 10]

          若有時間,也可以實現其它常見的排序算法。

          關于 Arrays的Sort算法分析 : http://www.slideshare.net/zianed/arrayssort 可以參考一下。

          posted on 2010-10-05 17:24 nieyong 閱讀(720) 評論(0)  編輯  收藏 所屬分類: Java

          公告

          所有文章皆為原創,若轉載請標明出處,謝謝~

          新浪微博,歡迎關注:

          導航

          <2010年10月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          統計

          常用鏈接

          留言簿(58)

          隨筆分類(130)

          隨筆檔案(151)

          個人收藏

          最新隨筆

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 武隆县| 耿马| 错那县| 恩施市| 浙江省| 临海市| 东乡族自治县| 旅游| 连平县| 门源| 平遥县| 连江县| 来宾市| 沐川县| 于田县| 专栏| 新竹县| 宣威市| 司法| 昭通市| 仲巴县| 昌邑市| 厦门市| 佛教| 德江县| 绵阳市| 兴化市| 策勒县| 广丰县| 共和县| 营山县| 盐城市| 安康市| 扬州市| 灵台县| 永和县| 宿松县| 天全县| 呈贡县| 建水县| 罗平县|