Programming Taskbook 0
Download 1.62 Mb. Pdf ko'rish
|
Abramyan-Pascal2016-1
- Bu sahifa navigatsiya:
- Расщепление Методы sequence of T * Partition
- LinqBegin17
Комбинирование
Методы sequence of T Concat(a2: sequence of T): sequence of T Union(a2: sequence of T): sequence of T Intersect(a2: sequence of T): sequence of T Except(a2: sequence of T): sequence of T * Interleave(a2: sequence of T): sequence of T * Interleave(a2, a3: sequence of T): sequence of T * Interleave(a2, a3, a4: sequence of T): sequence of T Глава 4. Запросы 69 Расщепление Методы sequence of T * Partition(pred: (T[, integer]) -> boolean): (sequence of T, sequence of T) * SplitAt(count: integer): (sequence of T, sequence of T) Запрос Concat возвращает последовательность, содержащую все эле- менты первой последовательности (вызвавшей данный метод), после кото- рых следуют все элементы второй последовательности (параметра a2). Запросы Union, Intersect и Except реализуют теоретико-множествен- ные операции (соответственно объединение, пересечение и разность) для двух исходных последовательностей (первой, вызвавшей запрос, и второй — параметра a2). Последовательность, полученная в результате выполне- ния любого из этих запросов, не содержит повторяющихся элементов. По- рядок следования элементов определяется порядком их первых вхождений в первую исходную последовательность (в случае операции объединения те элементы второй последовательности, которые отсутствуют в первой, рас- полагаются после элементов первой последовательности). Варианты запроса Interleave возвращают последовательность, в кото- рой чередуются элементы исходных последовательностей с одинаковыми индексами (можно объединять 2, 3 или 4 последовательности). Например, запрос a.Interleave(b,c) вернет последовательность, в которой элементы ис- ходных последовательностей располагаются следующим образом: a 0 , b 0 , c 0 , a 1 , b 1 , c 1 , a 2 , b 2 , c 2 и т. д. Заполнение выходной последовательности закон- чится, как только будет достигнут конец самой короткой из исходных по- следовательностей. Если, например, последовательность а содержит 7 эле- ментов, последовательность b — 5 элементов, а последовательность c — 10 элементов, то в полученной последовательности будет 15 элементов (по 5 начальных элементов из каждой исходной последовательности в ука- занном выше порядке). Запрос Partition «расщепляет» исходную последовательность на две ча- сти, возвращая кортеж из двух последовательностей (по поводу кортежей см. п. 1.4). В первую последовательность помещаются элементы, удовле- творяющие предикату pred; остальные элементы помещаются во вторую последовательность. В каждой полученной последовательности элементы следуют в том же порядке, в котором они располагались в исходной по- следовательности. Одна из полученных последовательностей может ока- заться пустой. В предикате pred можно использовать дополнительный па- раметр — индекс обрабатываемого элемента. Запрос SplitAt также расщепляет исходную последовательность на две части. В данном случае в первую часть включаются count начальных эле- ментов исходной последовательности, а во вторую — остальные ее эле- менты. Если count = 0, то первая полученная последовательность будет пу- 70 стой, если значение count больше или равно размеру исходной последова- тельности, то пустой будет вторая полученная последовательность. К запросам, выполняющим расщепление, можно также отнести специ- ализированный запрос UnzipTuple, который будет описан далее, в п. 4.4, совместно с парным к нему запросом объединения ZipTuple. Особенность запроса UnzipTuple состоит в том, что возвращаемый им кортеж содержит последовательности, тип элементов которых отличается от типа элемен- тов исходной последовательности. Проиллюстрируем некоторые из описанных в этом пункте запросов примерами задач из группы LinqBegin. В задаче LinqBegin17 требуется извлечь из исходной целочисленной последовательности все нечетные числа, сохранив их исходный порядок и удалив все вхождения повторяющихся элементов, кроме первых: Task('LinqBegin17'); ReadSeqInteger.Where(e -> Odd(e)).Distinct.WriteAll; Обратите внимание на то, что в задачах группы LinqBegin, в которых требуется вывести полученную последовательность, необходимо выводить не только элементы, но и размер последовательности (размер указывается первым). Напомним, что для организации такого вывода предусмотрен специальный запрос WriteAll и его синоним PrintAll, описанные в модуле PT4. В ситуации, когда при решении задачи к исходной последовательно- сти применяются несколько запросов, часто бывает желательно проверить, к какому результату приводит применение того или иного запроса. Для этого удобно использовать специальный вариант процедуры отладочной печати Show, реализованный в виде запроса (об отладочных средствах, включенных в задачник Programming Taskbook, см. п. 2.4). Например, можно дополнить цепочку запросов, использованных при решении задачи LinqBegin17, следующим образом (полужирным шрифтом выделены до- бавленные запросы, обеспечивающие отладочную печать): ReadSeqInteger.Where(e -> Odd(e)).Show.Distinct.Show.WriteAll; |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling