Массив, список List или кортеж?
Чем они отличаются?
В массиве все элементы имеют одинаковый тип. Обращение к нужному элементу осуществляется путем указания его индекса. Мы рассматриваем динамические массивы, поэтому индекс первого элемента всегда нулевой. Также, можно перебрать все элементы массива в порядке от первого к последнему. Значение любого элемента можно изменить путем присваивания.
Преимущества: компактное хранение данных, быстрый доступ, простое обновление, массив "знает" свою длину (свойство .Length), массивы могут иметь несколько измерений.
Недостатки: при создании массива необходимо указывать его размер, сложные манипуляции для вставки и удаления элементов.
Список List, как и массив, строится из элементов одного типа. В работе он обладает такими же свойствами, как и массив, но дополнительно позволяет легко добавлять новые элементы и удалять имеющиеся. Индекс первого элемента равен нулю. Добавление элемента в конец списка и удаление из списка последнего элемента происходит весьма эффективно. Вставка и удаление в другие места менее эффективны.
Преимущества: быстрый доступ к элементу по индексу, простое обновление, список "знает" свою длину (свойство .Count), возможность легко добавлять и удалять элементы.
Недостатки: работает медленнее массива, а затраты на хранение данных больше.
Кортеж похож на неизменяемый массив, но каждый его элемент может иметь собственный тип. К элементу можно обратиться по его индексу. Индекс первого элемента равен нулю. После создания кортежа нельзя изменить ни его длину, ни значения элементов. Максимальное количество элементов в кортеже равно семи.
Преимущества: типы элементов кортежа могут различаться, быстрый доступ к элементу осуществляется по индексу.
Недостатки: созданный кортеж неизменяем, длина кортежа не может превышать семи.
Особенности работы с данными
## var a := ArrRandom(15, 10, 99); a.Println; SetLength(a, a.Length + 3); a.Println; SetLength(a, 6); a.Print
33 58 94 37 54 51 52 85 14 13 27 32 45 35 88 33 58 94 37 54 51 52 85 14 13 27 32 45 35 88 0 0 0 33 58 94 37 54 51
## var a := ArrRandom(15, 10, 99); a.Println; var b := Copy(a); b[0] := 77; a.Println; // массив a не изменился b.Print // первый элемент изменен
51 37 59 71 48 77 28 41 22 95 62 98 55 77 26 51 37 59 71 48 77 28 41 22 95 62 98 55 77 26 77 37 59 71 48 77 28 41 22 95 62 98 55 77 26
3. Добавление группы значений в конец списка
##
var L := Lst('один', 'два', 'три');
L.Println;
L.AddRange(|'четыре', 'пять'|); // аргумент приводимый к последовательности
L.Printодин два три один два три четыре пять
4. Функция, возвращающая кортеж
## function Stat(a: array of integer) := (a.Min, a.Max, a.Average);
var a := ArrRandom(15, 10, 99); a.Println; Print(Stat(a))
86 20 54 58 67 28 64 47 21 56 48 84 85 40 43 (20,86,53.4)
5. Формирование списка из массива и массива из списка
## var a := ArrRandom(15, 10, 99); a.Println; var L := a.ToList; L.Add(-100); L.Println; a := L.ToArray; a.Println
54 98 88 43 73 33 86 20 76 88 90 31 19 65 96 54 98 88 43 73 33 86 20 76 88 90 31 19 65 96 -100 54 98 88 43 73 33 86 20 76 88 90 31 19 65 96 -100
6. Формирование кортежа из элементов массива. Распаковка кортежа в массив
##
var a := ArrRandom(15, 10, 99);
a.Println;
var t := (a[3], a[9], a[5], a[0]);
t.Println;
var b := t.ToString[2:^1].Replace(',', '').ToIntegers; // шаманство
b.Print // b - массив36 76 64 89 81 73 33 67 79 20 19 19 18 80 65 (89,20,73,36) 89 20 73 36
Рекомендации
Массив используем, когда известно количество размещаемых в нем однотипных элементов и не предвидится изменение этого количества. Для представления прямоугольных таблиц, содержащих данные типа T, используем двумерный массив array[,] of T. Для представления непрямоугольных таблиц (число элементов по строкам может разниться), содержащих данные типа T, используем массив массивов array of array of T.
Список List используем, когда количество размещаемых в нем однотипных элементов неизвестно или предвидится изменение количества элементов. Для представления таблиц, содержащих данные типа T, используем массив списков array of List<T> или список списков List<List<T>>.
Кортеж используем, когда количество элементов в нем не превышает семи и данные имеют различный тип. Если элементов больше семи, используем массив элементов типа string, преобразовывая данные к строковому типу.