在Java Collection Framework中定義的List實現有Vector
ArrayList和LinkedList
這些集合提供了對對象組的索引訪問
他們提供了元素的添加與刪除支持
然而
它們並沒有內置的元素排序支持
你能夠使用java
util
Collections類中的sort()方法對List元素進行排序
你既可以給方法傳遞一個List對象
也可以傳遞一個List和一個Comparator
如果列表中的元素全都是相同類型的類
並且這個類實現了Comparable接口
你可以簡單的調用Collections
sort()
如果這個類沒有實現Comparator
你也可以傳遞一個Comparator到方法sort()中
進行排序
如果你不想使用缺省的分類順序進行排序
你同樣可以傳遞一個Comparator到方法sort()中來進行排序
如果列表中的元素並不都是相同類型的類
你在進行排序的時候就不是這樣幸運了
除非你編寫一個專用的跨類的Comparator
排序的順序怎麼樣呢?如果元素是String對象
卻省的排序順序是按照字符編碼進行的
基本上是每個字符的ASCII/Unicode值
如果嚴格的限制在處理英文
卻省的排序順序通常是足夠的
因為它首先排A
Z
然後是小寫字母a
z
然而如果你處理非英文字
或者你只是想使用不同的排序順序
這樣Collections
sort()就出現了第二種變化
例如
你想使用字符串的反序進行排序
為了實現這個功能
你可以在Collections類中通過reverseOrder()來獲取一個反序Comparator
然後
你將反序Comparator傳遞給sort()方法
換句話說
你作如下工作
List list =
;
Comparator comp = Collections
reverseOrder();
Collections
sort(list
comp);
如果列表包含項目
Man
man
Woman
和woman
排序好的列表將是Man
Woman
man
woman
這裡沒有什麼復雜的
需要注意的非常重要的一點是Collections
sort()是進行原位排序
如果你需要保留原序
需要先對原集合進行復制
在排序
就像這樣
List list =
;
List copyOfList = new ArrayList(list);
Collections
sort(copyOfList);
這裡
排好序的列表是
Man
Woman
man
woman
但是原始列表(Man
man
Woman
woman)被保留了
到目前為止
排序是區分大小寫的
你如何進行不去分大小寫的排序呢?一種實現方式是象這樣實現Comparator:
public static class CaseInsensitiveComparator
implements Comparator {
public int compare(Object element
Object element
) {
String lower
=
element
toString()
toLowerCase();
String lower
=
element
toString()
toLowerCase();
return pareTo(lower
);
}
}
你確實不需要手工的創建這個類
而是
你可以是用以存在的Comparator
CASE_INSENSIVTIVE_ORDER
它是在String類中定義的
這種實現方式有一點小小的問題
Sort()算法提供穩定的排序
並保持與原有序列相同的元素
這意味著一個包含兩個元素
woman
和
Woman
的列表將有不同的排序
而這種不同是根據兩個元素在列表中出現的先後次序決定的
語言的不同又會怎麼樣呢?java
text包提供了Collector和CollectionKey類來進行區分語言的排序
這裡是例子:
注意
如果你的文本是本地語言
而不是缺省語言
你需要傳遞一個本地語種給getInstance()方法
就象:
public static class CollatorComparator
implements Comparator {
Collator collator = Collator
getInstance();
public int compare(Object element
Object element
) {
CollationKey key
= collator
getCollationKey(
element
toString());
CollationKey key
= collator
getCollationKey(
element
toString());
return pareTo(key
);
}
}
你是在對集合關鍵字進行排序
而不是實際的字符串
這不僅提供固定的不區分大小寫的排序
而且它是跨語種的排序
換句話說
如果你對西班牙文和非西班牙文的混合詞進行排序
詞ma?ana (tomorrow)將排在mantra的前面
如果你不使用Collector
ma?ana將排在mantra的後面
下面這個程序對一個列表進行不同類型的排序(缺省的
區分大小寫的
區分語種的)
import java
awt
BorderLayout;
import java
awt
Container;
import java
io
*;
import java
text
*;
import java
util
*;
import javax
swing
*;
public class SortIt {
public static class CollatorComparator
implements Comparator {
Collator collator = Collator
getInstance();
public int compare(Object element
Object element
) {
CollationKey key
= collator
getCollationKey(
element
toString());
CollationKey key
= collator
getCollationKey(
element
toString());
return pareTo(key
);
}
}
public static class CaseInsensitiveComparator
implements Comparator {
public int compare(Object element
Object element
) {
String lower
= element
toString()
toLowerCase();
String lower
= element
toString()
toLowerCase();
return pareTo(lower
);
}
}
public static void main(String args[]) {
String words[] =
{
man
Man
Woman
woman
Manana
manana
ma?ana
Ma?ana
Mantra
mantra
mantel
Mantel
};
// Create frame to display sortings
JFrame frame = new JFrame(
Sorting
);
frame
setDefaultCloseOperation(
JFrame
EXIT_ON_CLOSE);
Container contentPane = frame
getContentPane();
JTextArea textArea = new JTextArea();
JScrollPane pane = new JScrollPane(textArea);
contentPane
add(pane
BorderLayout
CENTER);
// Create buffer for output
StringWriter buffer = new StringWriter();
PrintWriter out = new PrintWriter(buffer);
// Create initial list to sort
List list = new ArrayList(Arrays
asList(words));
out
println(
Original list:
);
out
println(list);
out
println();
// Perform default sort
Collections
sort(list);
out
println(
Default sorting:
);
out
println(list);
out
println();
// Reset list
list = new ArrayList(Arrays
asList(words));
// Perform case insensitive sort
Comparator comp = new CaseInsensitiveComparator();
Collections
sort(list
comp);
out
println(
Case insensitive sorting:
);
out
println(list);
out
println();
// Reset list
list = new ArrayList(Arrays
asList(words));
// Perform collation sort
comp = new CollatorComparator();
Collections
sort(list
comp);
out
println(
Collator sorting:
);
out
println(list);
out
println();
// Fill text area and display
textArea
setText(buffer
toString());
frame
pack();
frame
show();
}
}
如果你的主要問題是順序訪問
可能列表不是你的好的數據結構選擇
只要你的集合沒有重復
你可以在樹(TreeSet)中保存你的元素(提供或不提供Comparator)
這樣
元素將總是排序形式的
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26066.html