這篇文章主要講的是如何使用現有的類庫對數組和各種Collection容器進行排序
首先要知道兩個類
java
util
Arrays和java
util
Collections(注意和Collection的區 別)Collection是集合框架的頂層接口
而Collections是包含了許多靜態方法
我們使用Arrays對數組進行排序
使用Collections對結合框架容器進行排序
如ArraysList
LinkedList等
例子中都要加上import java
util
*和其他外殼代碼
如類和靜態main方法
我會在第一個例子裡寫出全部代碼
接下來會無一例外的省略
比如有一個整型數組
int[] intArray = new int[] {
}; 我們如何進行排序呢?你這個時候是否在想快速排序的算法?看看下面的實現方法
import java
util
*; public class Sort{
public static void main(String[] args){
int[] intArray = new int[] {
};
Arrays
sort(intArray)
} }
這樣我們就用Arrays的靜態方法sort()對intArray進行了升序排序
現在數組已經變成了{
}
如果是字符數組
String[] strArray = new String[] {
z
a
C
}; 我們用
Arrays
sort(strArray)
進行排序後的結果是{C
a
z}
sort()會根據元素的自然順序進行升序排序
如果希望對大小寫不敏感的話可以這樣寫
Arrays
sort(strArray
String
CASE_INSENSITIVE_ORDER)
當然我們也可以指定數組的某一段進行排序比如我們要對數組下表
的部分(假設數組長度大於
)進行排序
其他部分保持不變
我們可以使用
Arrays
sort(strArray
)
這樣
我們只對前三個元素進行了排序
而不會影響到後面的部分
當然有人會想
我怎樣進行降序排序?在眾多的sort方法中有一個sort(T[] a
Comparator<? super T> c) 我們使用Comparator獲取一個反序的比較器即可
Comparator會在稍後講解
以前面的intArray[]為例
Arrays
sort(intArray
Comparator
reverseOrder())
這樣
我們得到的結果就是{
}
如果不想修改原有代碼我們也可以使用
Collections
reverse(Arrays
asList(intArray))
得到該數組的反序
結果同樣為
}
現在的情況變了
我們的數組裡不再是基本數據類型(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=pareTo(o
lastName)
return (lastCmp!=
?lastCmp:pareTo(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(inti=
;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(
)
list
add(
)
list
add(
)
list
add(
)
我們只需要使用
Collections
sort(list)
就可以將ll裡的元素按從小到大的順序進行排序
結果就成了
[
] 如果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 o
T o
)
} 其實Comparator裡的int compare(T o
T 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(n
firstName)
return(firstCmp!=
?firstCmp:pareTo
(n
firstName))
}
};
這樣一個我們自定義的Comparator FIRST_NAME_ORDER就寫好了
將上個例子裡那個名字數組轉化為List:List<Name> list=Arrays
asList(nameArray)
Collections
sort(list
FIRST_NAME_ORDER)
這樣我們就成功的使用自己定義的比較器設定排序
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26682.html