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

Массив

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

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

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

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

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

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

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

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

пер ПустойМассив = новый Массив<Число>()
пер МассивЧисел = [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