Java 集合架構 演算法__java

來源:互聯網
上載者:User

這裡描述的多態演算法是Java平台提供的可重用功能的一部分。它們都來自集合類,它們都採用靜態方法的形式,其第一個參數是要執行操作的集合。Java平台提供的絕大多數演算法都是在列表執行個體上操作的,但是其中一些演算法是在任意的集合執行個體上操作的。本節簡要介紹以下演算法: 排序 洗牌(打亂順序) 常規資料操作 搜尋 構成 找到極值 排序

排序演算法重新排序一個列表,使其元素按照排序關係按升序排列。提供了兩種形式的操作。這個簡單的表單會根據元素的自然排序來排序。如果您不熟悉自然排序的概念,請閱讀對象訂購部分。

排序操作使用一個稍微最佳化的合并排序演算法,它快速且穩定:

Fast:它保證在n log(n)時間運行,並且在幾乎已排序的列表上運行得更快。經驗測試表明,它與高度最佳化的快速排序一樣快。快速排序通常被認為比合并排序快,但不穩定,不能保證nlog (n)效能。
穩定:它不重新排列相等的元素。如果在不同的屬性上重複排序相同的列表,這一點很重要。如果一個郵件程式的使用者通過郵件發送日期對收件匣進行排序,然後通過發送方對其進行排序,那麼使用者自然會期望從給定的寄件者(仍然)中已經連續的訊息列表按郵件日期進行排序。只有當第二種情況穩定時,才有保證。
下面的小程式用詞典(字母)順序列印出它的參數。

import java.util.*;public class Sort {    public static void main(String[] args) {        List<String> list = Arrays.asList(args);        Collections.sort(list);        System.out.println(list);    }}

讓我們運行這個程式。

args = {“%”, “java”, “Sort”, “i”, “walk”, “the”, “line”};
產生以下輸出。

[%, Sort, i, java, line, the, walk]
這是個簡單的程式,演算法真的很容易使用,就像它們看起來一樣。

排序的第二種形式是在列表中添加比較子,並將元素與比較子進行排序。假設您想要從我們前面的樣本中以最大的anagram組的倒序順序列印出anagram組。下面的樣本向您展示了如何在排序方法的第二種形式的協助下實現這一點。

回想一下,anagram組以列表執行個體的形式儲存為Map中的值。修改後的列印代碼遍曆映射的values視圖,將每個通過最小大小測試的列表放入列表列表中。然後,代碼對這個列表進行排序,使用期望列表執行個體的比較子,並實現反向排序。最後,代碼遍曆已排序的列表,列印它的元素(anagram組)。下面的代碼替換了Anagrams樣本中main方法末尾的列印代碼。

// Make a List of all anagram groups above size threshold.List<List<String>> winners = new ArrayList<List<String>>();for (List<String> l : m.values())    if (l.size() >= minGroupSize)        winners.add(l);// Sort anagram groups according to sizeCollections.sort(winners, new Comparator<List<String>>() {    public int compare(List<String> o1, List<String> o2) {        return o2.size() - o1.size();    }});// Print anagram groups.for (List<String> l : winners)    System.out.println(l.size() + ": " + l);

在與Map介面部分相同的字典中運行程式,與最小的anagram組大小(8)相同,產生以下輸出。

12: [apers, apres, asper, pares, parse, pears, prase,       presa, rapes, reaps, spare, spear]11: [alerts, alters, artels, estral, laster, ratels,       salter, slater, staler, stelar, talers]10: [least, setal, slate, stale, steal, stela, taels,       tales, teals, tesla]9: [estrin, inerts, insert, inters, niters, nitres,       sinter, triens, trines]9: [capers, crapes, escarp, pacers, parsec, recaps,       scrape, secpar, spacer]9: [palest, palets, pastel, petals, plates, pleats,       septal, staple, tepals]9: [anestri, antsier, nastier, ratines, retains, retinas,       retsina, stainer, stearin]8: [lapse, leaps, pales, peals, pleas, salep, sepal, spale]8: [aspers, parses, passer, prases, repass, spares,       sparse, spears]8: [enters, nester, renest, rentes, resent, tenser,       ternes,��treens]8: [arles, earls, lares, laser, lears, rales, reals, seral]8: [earings, erasing, gainers, reagins, regains, reginas,       searing, seringa]8: [peris, piers, pries, prise, ripes, speir, spier, spire]8: [ates, east, eats, etas, sate, seat, seta, teas]8: [carets, cartes, caster, caters, crates, reacts,       recast,��traces]
洗牌(打亂順序)

shuffle演算法的作用與排序相反,破壞了列表中可能出現的任何順序。也就是說,這個演算法根據來自隨機源的輸入重新排序列表,這樣所有可能的排列都有相同的可能性,假設有一個合理的隨機性來源。該演算法對實現機率遊戲有一定的參考價值。例如,它可以用來洗牌一列表示牌組的牌對象。此外,它還有助於產生測試案例。

該操作有兩種形式:一種使用列表,使用預設的隨機性源,另一種要求調用者提供隨機對象作為隨機性的來源。該演算法的代碼被用作列表部分中的一個樣本。 常規資料操作

集合類提供了用於在列表對象上執行常規資料操作的五種演算法,它們都非常簡單: reverse-反轉列表中元素的順序。 fill-覆蓋列表中的每個元素,並具有指定的值。這個操作對於重新初始化一個列表非常有用。 copy-接受兩個參數,一個目標列表和一個源列表,並將源的元素複製到目標中,覆蓋其內容。目標列表必須至少和原始碼一樣長。如果它較長,則目標列表中的其餘元素不會受到影響。 swap——在列表中的指定位置交換元素。 addAll—將所有指定元素添加到集合中。要添加的元素可以單獨指定,也可以作為數組來指定。 搜尋

binarySearch演算法在排序列表中搜尋指定的元素。該演算法有兩種形式。第一個擷取一個列表和一個元素來搜尋(“搜尋鍵”)。此表單假定列表按照其元素的自然順序按升序排序。第二種表單除了列表和搜尋鍵之外,還有一個比較子,並假定列表按照指定的比較子按升序排序。排序演算法可以在調用binarySearch之前對列表進行排序。

兩種形式的傳回值相同。如果列表包含搜尋鍵,則返回其索引。如果沒有,傳回值是(-(插入點)- 1),插入點的位置的值將被插入到列表,或大於第一個元素的索引值或list.size()如果列表中的所有元素都小於指定值。這個公認的醜陋的公式保證傳回值將是>= 0,如果且僅當搜尋鍵被找到時。它基本上是將一個布爾(找到的)和一個整數(索引)合并成一個int傳回值的方法。

下面的習慣用法可以使用兩種形式的binarySearch操作,尋找指定的搜尋鍵,並在不存在的情況下將其插入適當的位置。

int pos = Collections.binarySearch(list, key);if (pos < 0)   l.add(-pos-1, key);
構成

frequency和disjoint演算法測試一個或多個集合的組成部分:

frequency——計數指定元素在指定集合中發生的次數。
disjoint-確定兩個集合是否分離;也就是說,它們是否包含相同的元素。 找到極值

min和max演算法分別返回指定集合中包含的最小和最大元素。這兩種操作都有兩種形式。這個簡單的表單只接受一個集合,並根據元素的自然排序返回最小(或最大)元素。第二種形式在集合中添加一個比較子,並根據指定的比較子返回最小(或最大)元素。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.