聶永的博客

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

          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 閱讀(721) 評論(0)  編輯  收藏 所屬分類: Java

          公告

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

          新浪微博,歡迎關注:

          導航

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

          統計

          常用鏈接

          留言簿(58)

          隨筆分類(130)

          隨筆檔案(151)

          個人收藏

          最新隨筆

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 监利县| 大荔县| 密山市| 崇文区| 南溪县| 玛多县| 丘北县| 镇安县| 巫溪县| 岳阳市| 阿拉善盟| 邹平县| 西藏| 桑植县| 桐乡市| 湟中县| 德兴市| 格尔木市| 邓州市| 肥乡县| 宁德市| 达尔| 九台市| 宣恩县| 曲麻莱县| 育儿| 滨海县| 南召县| 建瓯市| 宁乡县| 罗山县| 宜黄县| 瑞昌市| 蒙阴县| 黑龙江省| 阳城县| 巩留县| 丹巴县| 梁山县| 尚志市| 普安县|