排序算法可為一個(gè) List 重新排序,以使它的元素按照某種排序關(guān)系成上升式排序。有兩種形式的操作被提供。簡(jiǎn)單形式的操作只采用一個(gè) List 并按照它的元素的自然排序進(jìn)行排序。假如你對(duì)自然排序的概念不熟悉,那么應(yīng)該重新閱讀 對(duì)象排序(Object Ordering).
快速: 這個(gè)算法被保證運(yùn)行在 n log(n) 時(shí)間內(nèi),并在已基本排序的列表上,它的速度實(shí)質(zhì)上更快。經(jīng)驗(yàn)表明,它的速度與高度優(yōu)化的快速排序(quicksort)的速度差不多, Quicksort 一般被認(rèn)為快于合并排序,但它不穩(wěn)定,并不保證 n log(n)性能。
回想一下,排序表是以 List 對(duì)象的形式作為一個(gè) Map 中的值而被存儲(chǔ)的。修改后的打印代碼通過 Map 的 values視圖進(jìn)行迭代, 將每一個(gè)通過最小尺寸測(cè)試的List放進(jìn)List 之中。然后,代碼使用一個(gè)期望 List 對(duì)象的 Comparator 為這個(gè) List 排序,并實(shí)現(xiàn)反轉(zhuǎn)大小排序。最終,代碼通過現(xiàn)在已排序的 List 進(jìn)行迭代,打印它的元素(排序組)。這個(gè)代碼在 Perm 的 main 方法末尾替代了打印代碼:
// Make a List of all permutation groups above size threshold
List winners = new ArrayList();
for (Iterator i = m.values().iterator(); i.hasNext(); ) {
List l = (List) i.next();
if (l.size() = minGroupSize)
winners.add(l);
}
// Sort permutation groups according to size
Collections.sort(winners, new Comparator() {
public int compare(Object o1, Object o2) {
return ((List)o2).size() - ((List)o1).size();
}
});
// Print permutation groups
for (Iterator i=winners.iterator(); i.hasNext(); ) {
混排算法所做的正好與 sort 相反: 它打亂在一個(gè) List 中可能有的任何排列的蹤跡。也就是說,基于隨機(jī)源的輸入重排該 List, 這樣的排列具有相同的可能性(假設(shè)隨機(jī)源是公正的)。這個(gè)算法在實(shí)現(xiàn)一個(gè)碰運(yùn)氣的游戲中是非常有用的。例如,它可被用來混排代表一副牌的 Card 對(duì)象的一個(gè) List 。另外,在生成測(cè)試案例時(shí),它也是十分有用的。
這個(gè)操作有兩種形式。第一種只采用一個(gè) List 并使用默認(rèn)隨機(jī)源。第二種要求調(diào)用者提供一個(gè) Random 對(duì)象作為隨機(jī)源。這個(gè)算法的一些實(shí)際代碼曾在 List 課程中被作為例子使用。
常規(guī)數(shù)據(jù)操作(Routine Data Manipulation)
Collections 類為在 List 對(duì)象上的常規(guī)數(shù)據(jù)操作提供了三種算法。這些算法是十分簡(jiǎn)單明了的:
reverse: 反轉(zhuǎn)在一個(gè)列表中的元素的順序。
fill: 用特定值覆蓋在一個(gè) List 中的每一個(gè)元素。這個(gè)操作對(duì)初始化一個(gè) List 是十分有用的。
copy: 用兩個(gè)參數(shù),一個(gè)目標(biāo) List 和一個(gè)源 List, 將源的元素拷貝到目標(biāo),并覆蓋它的內(nèi)容。目標(biāo) List 至少與源一樣長(zhǎng)。假如它更長(zhǎng),則在目標(biāo) List 中的剩余元素不受影響。
搜索(Searching)
binary search (二進(jìn)制搜索)算法用二進(jìn)制搜索算法在一個(gè)已排序的 List 中尋找特定元素。這個(gè)算法有兩種形式。第一種采用一個(gè) List 和一個(gè)要尋找的元素 ( "搜索鍵(search key)")。這種形式假設(shè) List 是按照它的元素的自然排序排列成上升順序的。第二種形式除采用 List 外,還采用一個(gè) Comparator 以及搜索鍵,并假設(shè) List 是按照特定 Comparator 排列成上升順序的。 排序算法(描述見上) 可優(yōu)先于 binarySearch 而被用來為L(zhǎng)ist 排序。
兩種形式的返回值是相同的: 假如 List 包含搜索鍵,它的索引將被返回;假如不包括,則返回值為 (-(insertion point) - 1), 這里的 insertion point 被定義為一個(gè)點(diǎn),從這個(gè)點(diǎn)該值將被插入到這個(gè) List 中:大于該值的第一個(gè)元素的位置索引,或list.size()。 選用這個(gè)不可否認(rèn)的難看的公式是為了保證假如且僅假如搜索鍵被發(fā)現(xiàn),則返回值將等于0。它基本上是一個(gè)將布爾邏輯 ("found") 和整數(shù) ("index") 綜合到單一的int返回值的大雜燴。