Spec-Zone .ru
спецификации, руководства, описания, API
|
Полиморфные алгоритмы, описанные здесь, являются частями допускающей повторное использование функциональности, обеспеченной платформой Java. Все они происходят из Collections
class, и все принимают форму статических методов, первым параметром которых является набор, на котором должна быть выполнена работа. Значительное большинство алгоритмов, обеспеченных платформой Java, работает на List
Collection
sort
алгоритм переупорядочивает a List
так, чтобы его элементы были в порядке возрастания согласно отношению упорядочивания. Обеспечиваются две формы работы. Простая форма берет a List
и виды это согласно естественному упорядочиванию его элементов. Если Вы незнакомы с понятием естественного упорядочивания, считайте раздел
sort
работа использует немного оптимизированный алгоритм сортировки слиянием, который быстр и устойчив:
n log(n)
время и работает существенно быстрее в почти сортированных списках. Эмпирические тесты показали это, чтобы быть с такой скоростью, как чрезвычайно оптимизированный quicksort. quicksort, как обычно полагают, быстрее чем сортировка слиянием, но не устойчив и не гарантирует n log(n)
производительность.Следующий trivial program
распечатывает его параметры в лексикографическом (алфавитном) порядке.
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); } }
Давайте выполнять программу.
% java Sort i walk the line
Следующий вывод производится.
[i, line, the, walk]
Программа была включена только, чтобы показать Вам, что алгоритмы действительно столь же удобны, как они, кажется.
Вторая форма sort
берет a Comparator
в дополнение к a List
и виды элементы с Comparator
. Предположите, что Вы хотите распечатать группы анаграммы от нашего более раннего примера в обратном порядке размера — самая многочисленная группа анаграммы сначала. Пример, который следует за шоу Вы, как достигнуть этого со справкой второй формы sort
метод.
Вспомните, что группы анаграммы сохранены как значения в a Map
, в форме List
экземпляры. Пересмотренный код печати выполняет итерации через Map
's оценивает представление, помещая каждый List
это проходит тест минимального размера в a List
из List
s. Затем код сортирует это List
, использование a Comparator
это ожидает List
экземпляры, и реализации инвертируют упорядочивание размера. Наконец, код выполняет итерации через сортированный List
, печать его элементов (группы анаграммы). Следующий код заменяет код печати в конце main
метод в Anagrams
пример.
// 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 size Collections.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);
Выполнение the program
на same dictionary
как в разделе Интерфейса Карты, с тем же самым минимальным групповым размером анаграммы (восемь), производит следующий вывод.
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
алгоритм делает противоположность какой sort
делает, уничтожая любую трассировку порядка, который, возможно, присутствовал в a List
. Таким образом, этот алгоритм переупорядочивает List
основанный на вводе из источника случайности так, что все возможные перестановки происходят с равной вероятностью, принимая справедливый источник случайности. Этот алгоритм полезен в реализации азартных игр. Например, это могло использоваться, чтобы переставить a List
из Card
объекты, представляющие деку. Кроме того, это полезно для генерирования прецедентов.
У этой работы есть две формы: каждый берет a List
и использует источник значения по умолчанию случайности, и другой требует, чтобы вызывающая сторона обеспечила Случайный объект использовать в качестве источника случайности. Код для этого алгоритма используется в качестве примера в List
раздел.
Collections
class обеспечивает пять алгоритмов для того, чтобы они сделали стандартное манипулирование данными на List
объекты, все из которых являются довольно прямыми:
reverse
— инвертирует порядок элементов в a List
.fill
— перезаписывает каждый элемент в a List
с указанным значением. Эта работа полезна для переинициализации a List
.copy
— берет два параметра, место назначения List
и источник List
, и копирует элементы источника в место назначения, перезаписывая его содержание. Место назначения List
должен быть, по крайней мере, пока источник. Если это более длинно, остающиеся элементы в месте назначения List
незатронуты.swap
— подкачивает элементы в указанных позициях в a List
.addAll
— добавляют все указанные элементы к a Collection
. Элементы, которые будут добавлены, могут быть определены индивидуально или как массив. binarySearch
алгоритм ищет указанный элемент в сортированном List
. У этого алгоритма есть две формы. Первые взятия a List
и элемент, чтобы искать ("ключ поиска"). Эта форма предполагает что List
сортируется в порядке возрастания согласно естественному упорядочиванию его элементов. Вторая форма берет a Comparator
в дополнение к List
и ключ поиска, и предполагает что List
сортируется в порядок по возрастанию согласно указанному Comparator
. sort
алгоритм может привыкнуть к виду List
до вызова binarySearch
.
Возвращаемое значение является тем же самым для обеих форм. Если List
содержит ключ поиска, индексировать возвращается. В противном случае возвращаемое значение (-(insertion point) - 1)
, где точка вставки является точкой, в которой значение было бы вставлено в List
, или индексирование первого элемента, больше чем значение или list.size()
если все элементы в List
меньше чем указанное значение. Эта по общему признанию уродливая формула гарантирует, что возвращаемое значение будет >= 0
если и только если ключ поиска находится. Это - в основном взлом, чтобы объединить булево (found)
и целое число (index)
в сингл int
возвращаемое значение.
Следующая идиома, применимая с обеими формами binarySearch
работа, ищет указанный ключ поиска и вставляет его в соответствующей позиции, если он уже не присутствует.
int pos = Collections.binarySearch(list, key); if (pos < 0) l.add(-pos-1);
Частота и непересекающиеся алгоритмы тестируют некоторый аспект состава один или больше Collections
:
frequency
— считает число раз, указанный элемент происходит в указанном набореdisjoint
— определяет ли два Collections
являются непересекающимися; то есть, не содержат ли они элементов вместе min
и max
возврат алгоритмов, соответственно, минимальный и максимальный элемент содержится в указанном Collection
. Обе из этих операций прибывают в две формы. Простая форма берет только a Collection
и возвращает минимум (или максимум) элемент согласно естественному упорядочиванию элементов. Вторая форма берет a Comparator
в дополнение к Collection
и возвращает минимум (или максимум) элемент согласно указанному Comparator
.