Programming Taskbook 0


Download 1.62 Mb.
Pdf ko'rish
bet43/71
Sana21.06.2023
Hajmi1.62 Mb.
#1644761
TuriУчебное пособие
1   ...   39   40   41   42   43   44   45   46   ...   71
Bog'liq
Abramyan-Pascal2016-1

Комбинирование
Методы 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; 


Download 1.62 Mb.

Do'stlaringiz bilan baham:
1   ...   39   40   41   42   43   44   45   46   ...   71




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling