国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java中集合和數組的排序方式小結

Java中集合和數組的排序方式小結

2019-12-08 21:13junjie JAVA教程

這篇文章主要介紹了Java中集合和數組的排序方式小結,本文講解了對數字數組、字符數組排序以及集合序列的排序,需要的朋友可以參考下

根據約定,在使用java編程的時候應盡可能的使用現有的類庫,當然你也可以自己編寫一個排序的方法,或者框架,但是有幾個人能寫得比JDK里的還要好呢?使用現有的類的另一個好處是代碼易于閱讀和維護,這篇文章主要講的是如何使用現有的類庫對數組和各種Collection容器進行排序,(文章中的一 部分例子來自《Java Developers Almanac 1.4》)

首先要知道兩個類:java.util.Arrays和java.util.Collections(注意和Collection的區 別)Collection是集合框架的頂層接口,而Collections是包含了許多靜態方法。我們使用Arrays對數組進行排序,使用 Collections對結合框架容器進行排序,如ArraysList,LinkedList等。

例子中都要加上import java.util.*和其他外殼代碼,如類和靜態main方法,我會在第一個例子里寫出全部代碼,接下來會無一例外的省略。

對數組進行排序

比如有一個整型數組:

復制代碼代碼如下:

int[] intArray = new int[] {4, 1, 3, -23};


我們如何進行排序呢?你這個時候是否在想快速排序的算法?看看下面的實現方法:

復制代碼代碼如下:

import java.util.*;  
public class Sort{  
    public static void main(String[] args){  
        int[] intArray = new int[] {4, 1, 3, -23};  
        Arrays.sort(intArray);  
    }  
}


這樣我們就用Arrays的靜態方法sort()對intArray進行了升序排序,現在數組已經變成了{-23,1,3,4}.

 

如果是字符數組:

復制代碼代碼如下:

String[] strArray = new String[] {"z", "a", "C"};


我們用:

復制代碼代碼如下:

Arrays.sort(strArray);


進行排序后的結果是{C,a,z},sort()會根據元素的自然順序進行升序排序。如果希望對大小寫不敏感的話可以這樣寫:

復制代碼代碼如下:

Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);


當然我們也可以指定數組的某一段進行排序比如我們要對數組下表0-2的部分(假設數組長度大于3)進行排序,其他部分保持不變,我們可以使用:

復制代碼代碼如下:

Arrays.sort(strArray,0,2);


這樣,我們只對前三個元素進行了排序,而不會影響到后面的部分。

 

當然有人會想,我怎樣進行降序排序?在眾多的sort方法中有一個

復制代碼代碼如下:

sort(T[] a, Comparator<? super T> c)


我們使用Comparator獲取一個反序的比較器即可,Comparator會在稍后講解,以前面的intArray[]為例:

復制代碼代碼如下:

Arrays.sort(intArray,Comparator.reverseOrder());


這樣,我們得到的結果就是{4,3,1,-23}。如果不想修改原有代碼我們也可以使用:

復制代碼代碼如下:

Collections.reverse(Arrays.asList(intArray));


得到該數組的反序。結果同樣為4,3,1,-23}。

 

現在的情況變了,我們的數組里不再是基本數據類型(primtive type)或者String類型的數組,而是對象數組。這個數組的自然順序是未知的,因此我們需要為該類實現Comparable接口,比如我們有一個Name類:

復制代碼代碼如下:

class Name implements Comparable<Name>{  
    public String firstName,lastName;  
    public Name(String firstName,String lastName){  
        this.firstName=firstName;  
        this.lastName=lastName;  
    }  
    public int compareTo(Name o) {          //實現接口  
        int lastCmp=lastName.compareTo(o.lastName);  
        return (lastCmp!=0?lastCmp:firstName.compareTo(o.firstName));  
    }      
    public String toString(){                //便于輸出測試  
        return firstName+" "+lastName;  
    }  
}


這樣,當我們對這個對象數組進行排序時,就會先比較lastName,然后比較firstName 然后得出兩個對象的先后順序,就像compareTo(Name o)里實現的那樣。不妨用程序試一試:

復制代碼代碼如下:

import java.util.*;  
 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")  
        };
        Arrays.sort(nameArray);  
        for(int i=0;i<nameArray.length;i++){  
            System.out.println(nameArray[i].toString());  
        }  
    }  
}


結果正如我們所愿:

復制代碼代碼如下:

Oscar Grouch  
John Lennon  
Groucho Marx  
Karl Marx


對集合框架進行排序

 

如果已經理解了Arrays.sort()對數組進行排序的話,集合框架的使用也是大同小異。只是將Arrays替換成了Collections,注意Collections是一個類而Collection是一個接口,雖然只差一個”s”但是它們的含義卻完全不同。

假如有這樣一個鏈表:

復制代碼代碼如下:

LinkedList list=new LinkedList();  
list.add(4);  
list.add(34);  
list.add(22);  
list.add(2);


我們只需要使用:

復制代碼代碼如下:

Collections.sort(list);


就可以將ll里的元素按從小到大的順序進行排序,結果就成了:

復制代碼代碼如下:

[2, 4, 22, 34]


如果LinkedList里面的元素是String,同樣會想基本數據類型一樣從小到大排序。

 

如果要實現反序排序也就是從達到小排序:

復制代碼代碼如下:

Collections.sort(list,Collectons.reverseOrder());


如果LinkedList里面的元素是自定義的對象,可以像上面的Name對象一樣實現Comparable接口,就可以讓Collection.sort()為您排序了。

 

如果你想按照自己的想法對一個對象進行排序,你可以使用

復制代碼代碼如下:

sort(List<T> list, Comparator<? super T> c)


這個方法進行排序,在給出例子之前,先要說明一下Comparator的使用,Comparable接口的格式:

復制代碼代碼如下:

public interface Comparator<T> {  
    int compare(T o1, T o2);  
}


其實Comparator里的int compare(T o1,T o2)的寫法和Comparable里的compareTo()方法的寫法差不多。在上面的Name類中我們的比較是從LastName開始的,這是西方 人的習慣,到了中國,我們想從fristName開始比較,又不想修改原來的代碼,這個時候,Comparator就可以派上用場了:

復制代碼代碼如下:

final Comparator<Name> FIRST_NAME_ORDER=new Comparator<Name>() {  
    public int compare(Name n1, Name n2) {  
         int firstCmp=n1.firstName.compareTo(n2.firstName);  
         return (firstCmp!=0?firstCmp:n1.lastName.compareTo   
                 (n2.firstName));  
    }  
};


這樣一個我們自定義的Comparator FIRST_NAME_ORDER就寫好了。

 

將上個例子里那個名字數組轉化為List:

復制代碼代碼如下:

List<Name> list=Arrays.asList(nameArray);  
Collections.sort(list,FIRST_NAME_ORDER);


這樣我們就成功的使用自己定義的比較器設定排序。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩精品一二三 | 免费在线黄色电影 | 精品女同一区二区三区在线绯色 | a级片在线观看 | 欧美v片| 中文字幕精品视频 | 亚州成人| 蜜桃臀一区二区三区 | 亚洲狠狠丁香婷婷综合久久久 | 国产精品久久久久久久 | 色678黄网站全部免费 | 综合久久综合 | 欧美精品第一页 | 夜夜嗨aⅴ免费视频 | 日韩福利在线 | 久久69精品久久久久久久电影好 | 黄色片视频免费 | 久久久久一区 | 亚洲www啪成人一区二区 | 夜夜av| 欧美一区二区免费 | 亚洲第一av网站 | 成人av一级片| 亚洲精品欧美 | 国产a自拍| 成人午夜 | 黄色午夜 | 久久人人爽人人爽人人片av不 | 国产精品1区2区 | 久久精品黄色 | 依人在线 | 欧美黄色一级片免费看 | 久久福利| 日韩在线精品视频 | 免费成人黄色 | 欧美成人精品一区 | 97久久超碰 | 涩涩视频观看 | 欧美日一区二区 | 在线视频91| 日韩在线观看成人 |