Перейти к основному содержимому

Массив

Массив — это структура данных для хранения некоторого набора значений. Элементы массива могут быть как одного, так и различных типов. Доступ к каждому элементу осуществляется по его индексу.

Размер массива

Любой массив имеет определенный размер, который определяется количеством элементов массива. Размер массива может изменяться динамически, например при добавлении или удалении элементов. Используйте метод Размер(), чтобы определить текущий размер массива.

Изменяемые и неизменяемые массивы

Массивы делятся на два вида:

  • В фиксированном массиве нельзя изменять значения элементов или размер самого массива. Для описания неизменяемого массива в языке используется тип ЧитаемыйМассив<ТипЭлемента>.
  • В изменяемом массиве возможно как изменение любого элемента, так и изменение параметров самого массива. Изменяемый массив мы будем называть обычным массивом, или просто массивом. Для описания изменяемого массива в языке используется тип Массив<ТипЭлемента>.

Создание массива

Создание массива выполняется следующим способом:

пер ПустойМассив = новый Массив<Число>()
пер МассивЧисел = [1, 2, 3]
пер МассивКопия = новый Массив<Число>(МассивЧисел)

пер МассивСтрок = новый Массив<Строка>()
МассивСтрок.Добавить("Первая строка")
МассивСтрок.Добавить("Третья строка")
МассивСтрок.Вставить(Индекс = 1, Элемент = "Вторая строка")

пер Коэффициенты: Массив<Число>
Коэффициенты = [1, 2, 3]

Все созданные выше массивы являются изменяемыми и могут быть заполнены необходимыми данными. При создании массива копированием в новый массив переносятся все элементы массива-источника.

Создание фиксированного массива выполняется аналогичным образом:

знч ЧитаемыйМассивЧисел: ЧитаемыйМассив<Число> = [1, 2, 3]
знч ЧитаемыйМассивКонстант = новый ЧитаемыйМассив<Число>([3.141592654, 2.718281828])

Элементами массива могут быть значения произвольных типов. В примере ниже показано создание массива, элементами которого являются массивы чисел.

пер Матрица1 = <Массив<Число>>[<Число>[1, 2, 3], <Число>[4, 5, 6]]

пер Матрица2: Массив<Массив<Число>>
Матрица2.Добавить(новый Массив<Число>([1, 2, 3]))
Матрица2.Добавить(новый Массив<Число>([4, 5, 6]))

Во всех вышеприведенных примерах создается переменная, которая хранит ссылку на массив значений. Однако вы можете использовать массив, не объявляя для этого отдельную переменную. Для этого используйте литерал вида [элемент0, ..., элементN]:

метод ВычислитьСуммуИСреднее(): Строка
пер Сумма = 0

для Число из [10, 20, 30, 40, 50]
Сумма += Число
;

знч Среднее = [10, 20, 30, 40, 50].Среднее()

возврат "Сумма = $Сумма, среднее = $Среднее"
;

Доступ к элементам массива

Для обращения к элементу массива используется индекс. Индекс массива является целым числом в диапазоне от 0 до 231–1. Массив из N элементов индексируется от 0 до N–1, где 0 — это индекс первого элемента в массиве. Обращение по индексу за границей массива приведет к исключению ИсключениеИндексВнеГраниц. Ошибка также возникнет, если в качестве индекса указать дробное число.

Для обращения к элементам массива можно использовать следующие способы:

  • Операция доступа по индексу

    В этом случае индекс требуемого элемента массива нужно указать внутри квадратных скобок []. Например, обращение к пятому элементу массива Коэффициенты будет выглядеть следующим образом: Коэффициенты[4].

  • Функциональный способ

    В этом случае индекс нужного элемента массива нужно указать в качестве параметра метода Получить(). Например, обращение к пятому элементу массива Коэффициенты будет выглядеть следующим образом: Коэффициенты.Получить(4).

знч МассивЧисел = [1, 2, 3]
знч ДоступПоИндексу = МассивЧисел[0] // 1
знч ФункциональныйСпособ = МассивЧисел.Получить(1) // 2

Обход массива

Вы можете использовать циклы для по, для из и пока для обхода элементов массива, как показано в примерах ниже.

При обходе массива не допускается изменение его состава. При попытке такого изменения будет выброшено исключение.

Обход массива с помощью цикла «для по»
метод ОбходМассива(МассивЧисел: Массив<Число>)
пер ТекущийЭлемент: Число

для Индекс = 0 по МассивЧисел.Граница()
// Получение текущего элемента массива
ТекущийЭлемент = МассивЧисел[Индекс]
// Дальнейшая обработка массива...
;
;
Обход массива с помощью цикла «для из»
метод ОбходМассива(МассивЧисел: Массив<Число>)
пер ТекущийЭлемент: Число

для Число из МассивЧисел
// Получение текущего элемента массива
ТекущийЭлемент = Число
// Дальнейшая обработка массива...
;
;
Обход массива с помощью цикла «пока»
метод ОбходМассива(МассивЧисел: Массив<Число>)
пер ТекущийЭлемент: Число

пер Индекс = 0
пока Индекс <= МассивЧисел.Граница()
// Получение текущего элемента массива
ТекущийЭлемент = МассивЧисел[Индекс]
// Дальнейшая обработка массива...
Индекс += 1
;
;

Массив как параметр метода

Если массив используется как параметр метода, в качестве типа параметра следует использовать тип ЧитаемыйМассив<ТипЭлемента>. В этом случае в метод можно передать как фиксированный, так и обычный массив. Это возможно потому, что тип Массив<ТипЭлемента> является потомком типа ЧитаемыйМассив<ТипЭлемента>.

метод ВычислитьСумму(МассивЧисел: ЧитаемыйМассив<Число>): Число
пер Сумма = 0

для Число из МассивЧисел
Сумма += Число
;

возврат Сумма
;

метод ВыполнитьВычисления()
// Передача в метод обычного (изменяемого) массива
знч МассивЧисел = [1, 2, 3, 4, 5]
знч Сумма1= ВычислитьСумму(МассивЧисел) // 15

// Передача в метод фиксированного (неизменяемого) массива
знч ЧитаемыйМассивЧисел: ЧитаемыйМассив<Число> = [10, 20, 30, 40, 50]
знч Сумма2= ВычислитьСумму(ЧитаемыйМассивЧисел) // 150
;

Если в методе ВычислитьСумму() изменить тип параметра на Массив<ТипЭлемента>, то попытка передать в метод фиксированный массив в качестве аргумента приведет к ошибке компиляции из-за несовпадения типов.

Сравнение массивов

Поддерживается сравнение массивов на равенство или неравенство. Два массива являются равными, если они имеют одинаковый размер и содержат одинаковые элементы в одинаковом порядке, то есть каждый элемент с определенным индексом в первом массиве должен быть равен соответствующему элементу с тем же индексом во втором массиве. Если элемент массива является другим массивом, выполняется попытка рекурсивного сравнения.

метод СравнитьМассивы()
знч МассивЧисел1 = [1, 2, 3]
знч МассивЧисел2 = [3, 2, 1]
знч МассивЧисел3: ЧитаемыйМассив<Число> = [1, 2, 3]

знч Равны1 = МассивЧисел1 == МассивЧисел2 // Ложь
знч Равны2 = МассивЧисел1 == МассивЧисел3 // Истина
знч Равны3 = МассивЧисел2 == МассивЧисел3 // Ложь
;

Операции над элементами массива

Методы, унаследованные от базового типа Обходимое<ТипЭлемента>, позволяют вам выполнять различные операции над массивами. Например, вы можете:

  • сортировать элементы массива с помощью перегрузок метода Сортировать():

    знч Числа = [20, 10, 50, 30, 40]
    знч ПоВозрастанию = Числа.Сортировать((а, б) -> а - б) // [10, 20, 30, 40, 50]
    знч ПоУбыванию = Числа.Сортировать((а, б) -> б - а) // [50, 40, 30, 20, 10]
  • фильтровать элементы массива с помощью метода Фильтровать():

    знч Числа = [-20, - 10, 0, 10, 20]
    знч Положительные = Числа.Фильтровать(Элемент -> Элемент > 0) // [10, 20]
  • объединять элементы массива в группы с помощью перегрузок метода ГруппироватьПо():

    метод ГруппироватьПоОтделам()
    знч СписокСотрудников =
    [новый Сотрудник(Фамилия = "Петров", Отдел = "Разработка"),
    новый Сотрудник(Фамилия = "Смирнов", Отдел = "Разработка"),
    новый Сотрудник(Фамилия = "Иванов", Отдел = "Тестирование")]

    знч Группировка: Соответствие<Строка, Массив<Сотрудник>> = СписокСотрудников.ГруппироватьПо(Элемент -> Элемент.Отдел)
    ;
    // {"Разработка": [{Фамилия="Петров", Отдел="Разработка"}, {Фамилия="Смирнов", Отдел="Разработка"}]
    // "Тестирование": [{Фамилия="Иванов", Отдел="Тестирование"}]}

    структура Сотрудник
    пер Фамилия: Строка
    пер Отдел: Строка
    ;
  • выполнять вычисления над элементами массива с помощью методов Сумма(), Среднее(), Минимум(), Максимум():

    знч Числа = [10, 20, 30, 40, 50]
    знч Сумма = Числа.Сумма() // 150
    знч Среднее = Числа.Среднее() // 30
    знч Минимум = Числа.Минимум() // 10
    знч Максимум = Числа.Максимум() // 50