熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

分析Java集合框架及數組的排序

2013-11-23 19:20:16  來源: Java核心技術 
    這篇文章主要講的是如何使用現有的類庫對數組和各種Collection容器進行排序首先要知道兩個類javautilArrays和javautilCollections(注意和Collection的區 別)Collection是集合框架的頂層接口而Collections是包含了許多靜態方法我們使用Arrays對數組進行排序使用Collections對結合框架容器進行排序如ArraysListLinkedList等例子中都要加上import javautil*和其他外殼代碼如類和靜態main方法我會在第一個例子裡寫出全部代碼接下來會無一例外的省略
   
    比如有一個整型數組
   
    int[] intArray = new int[] { }; 我們如何進行排序呢?你這個時候是否在想快速排序的算法?看看下面的實現方法
   
    import javautil*;  public class Sort{
   
    public static void main(String[] args){
   
    int[] intArray = new int[] { };
   
    Arrayssort(intArray)      }  }
   
    這樣我們就用Arrays的靜態方法sort()對intArray進行了升序排序現在數組已經變成了{}
   
    如果是字符數組String[] strArray = new String[] {z a C}; 我們用Arrayssort(strArray) 進行排序後的結果是{Caz}sort()會根據元素的自然順序進行升序排序如果希望對大小寫不敏感的話可以這樣寫Arrayssort(strArray StringCASE_INSENSITIVE_ORDER) 當然我們也可以指定數組的某一段進行排序比如我們要對數組下表的部分(假設數組長度大於)進行排序其他部分保持不變我們可以使用Arrayssort(strArray 這樣我們只對前三個元素進行了排序而不會影響到後面的部分
   
    當然有人會想我怎樣進行降序排序?在眾多的sort方法中有一個sort(T[] a Comparator<? super T> c) 我們使用Comparator獲取一個反序的比較器即可Comparator會在稍後講解以前面的intArray[]為例Arrayssort(intArrayComparatorreverseOrder()) 這樣我們得到的結果就是{}如果不想修改原有代碼我們也可以使用Collectionsreverse(ArraysasList(intArray)) 得到該數組的反序結果同樣為}
   
    現在的情況變了我們的數組裡不再是基本數據類型(primtive type)或者String類型的數組而是對象數組這個數組的自然順序是未知的因此我們需要為該類實現Comparable接口比如我們有一個Name類
   
    class Name implements Comparable<Name>{
   
    public String firstNamelastName;
   
    public Name(String firstNameString lastName){
   
    thisfirstName=firstName;
   
    thislastName=lastName;   }
   
    public int compareTo(Name o) {    //實現接口
   
    int lastCmp=pareTo(olastName)
   
    return (lastCmp!=?lastCmp:pareTo(ofirstName))      }
   
    public String toString(){     //便於輸出測試
   
    return firstName+ +lastName;      }  }


   
    這樣當我們對這個對象數組進行排序時就會先比較lastName然後比較firstName 然後得出兩個對象的先後順序就像compareTo(Name o)裡實現的那樣不妨用程序試一試
   
    import javautil*;
   
    public class NameSort {
   
    public static void main(String[] args) {
   
    Name nameArray[] = {
   
    new Name(John Lennon
   
    new Name(Karl Marx
   
    new Name(Groucho Marx
   
    new Name(Oscar Grouch
   
    Arrayssort(nameArray)
   
    for(inti=;i<nameArraylength;i++){
   
    Systemoutprintln(nameArray[i]toString())          }      }  }
   
    結果正如我們所願
   
    Oscar Grouch  John Lennon  Groucho Marx  Karl Marx 對集合框架進行排序如果已經理解了Arrayssort()對數組進行排序的話集合框架的使用也是大同小異只是將Arrays替換成了Collections注意Collections是一個類而Collection是一個接口雖然只差一個s但是它們的含義卻完全不同
   
    假如有這樣一個鏈表
   
    LinkedList list=new LinkedList()
   
    listadd(
   
    listadd(
   
    listadd(
   
    listadd(
   
    我們只需要使用Collectionssort(list) 就可以將ll裡的元素按從小到大的順序進行排序結果就成了[ ] 如果LinkedList裡面的元素是String同樣會想基本數據類型一樣從小到大排序如果要實現反序排序也就是從達到小排序Collectionssort(listCollectonsreverseOrder()) 如果LinkedList裡面的元素是自定義的對象可以像上面的Name對象一樣實現Comparable接口就可以讓Collectionsort()為您排序了如果你想按照自己的想法對一個對象進行排序你可以使用sort(List<T> list Comparator<? super T> c) 這個方法進行排序在給出例子之前先要說明一下Comparator的使用Comparable接口的格式public interface Comparator<T> { int compare(T o T o  }  其實Comparator裡的int compare(T oT o)的寫法和Comparable裡的compareTo()方法的寫法差不多在上面的Name類中我們的比較是從LastName開始的這是西方 人的習慣到了中國我們想從fristName開始比較又不想修改原來的代碼這個時候Comparator就可以派上用場了
   
    final Comparator<Name> FIRST_NAME_ORDER=new Comparator<Name>()
   
    {
   
    public int compare(Name n Name n
   
    {
   
    int firstCmp=pareTo(nfirstName)
   
    return(firstCmp!=?firstCmp:pareTo
   
    (nfirstName))
   
       }
   
           };
   
    這樣一個我們自定義的Comparator FIRST_NAME_ORDER就寫好了將上個例子裡那個名字數組轉化為List:List<Name> list=ArraysasList(nameArray) Collectionssort(listFIRST_NAME_ORDER) 這樣我們就成功的使用自己定義的比較器設定排序


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26682.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.