Работа с массивами
8 мин
Конструкторы
Создать массив можно несколькими способами:
1. По количеству элементов
Новый Массив(<КоличествоЭлементов1>, <КоличествоЭлементов2>, ..., <КоличествоЭлементовN>)
- <КоличествоЭлементов1>, <КоличествоЭлементов2>, ..., <КоличествоЭлементовN> (необязательный) - Число - количество элементов в соответствующем измерении
Возвращает массив.
Если не указывать количество, будет создан пустой массив.
ПустойМассив = Новый Массив;
Если заполнить первый параметр, то будет создан массив с определенным количеством.
СтороныСвета = Новый Массив(4);
Стороны Света - массив, содержащий 4 пустых элемента.
Массив может содержать в качестве элементов произвольные объекты, в том числе другие массивы. Если заполнить первый и последующие параметры, то получим массив, в котором содержится <КоличествоЭлементов1> массивов, в каждом из которых <КоличествоЭлементов2> массивов и т. д., последнее <КоличествоЭлементовN> - количество элементов последнего массива.
Иерархия = Новый Массив(1, 2, 3);
В массиве «Иерархия» содержится один массив, внутри которого 2 массива, внутри каждого из 2-х массивов содержится 3 элемента.
2. На основании фиксированного массива
Фиксированный массив - неизменяемый массив. В нем нельзя изменить количество элементов после создания.
Пусть имеется фиксированный массив СписокПолей, тогда
ПолныйСписокПолей = Новый Массив(СписокПолей);
ПолныйСписокПолей - массив с элементами СписокПолей.
К элементам массива можно обращаться через оператор [..]. Обратившись к элементу, можно работать с ним как с переменной.
СтороныСвета = Новый Массив(4); // создан массив с 4 пустыми элементами типа Неопределено
ВторойЭлемент = СтороныСвета[1]; // обращение ко 2 элементу, цифра 1 т.к счет идет с 0
СтороныСвета = Новый Массив(2);
СтороныСвета[0] = "Север";
СтороныСвета[1] = "Юг";
Сообщить(СтороныСвета[1]); // Юг
Методы
1. Добавить(<Значение>)
- <Значение> (необязательный) - Произвольный, если значение не указано, то Неопределено.
Добавляет элемент в конец массива.
СтороныСвета = Новый Массив;
СтороныСвета.Добавить("Север");
СтороныСвета.Добавить("Юг");
Юг = СтороныСвета[1];
Сообщить(Юг); // Юг
2. ВГраница()
Возвращает наибольший индекс в массиве. Если количество 0, то возвращает -1
СтороныСвета = Новый Массив(4);
НаибольшийИндекс = СтороныСвета.ВГраница();
Сообщить(НаибольшийИндекс); // 3
3. Вставить(<Индекс>, <Значение>)
- <Индекс> (необязательный) - Число, индекс куда будет вставлено Значение
Вставляет значение в массив по указанному индексу
СтороныСвета = Новый Массив;
СтороныСвета.Добавить("Север");
СтороныСвета.Добавить("Юг");
СтороныСвета.Вставить(1, "Запад");
Сообщить(СтороныСвета[0]); // Север
Сообщить(СтороныСвета[1]); // Запад
4. Количество()
Возвращает количество элементов массива
СтороныСвета = Новый Массив;
СтороныСвета.Добавить("Север");
СтороныСвета.Добавить("Юг");
КоличествоЭлементов = СтороныСвета.Количество();
Сообщить(КоличествоЭлементов); // 2
5. Найти(<Значение>)
Возвращает индекс первого найденного элемента, если элемента нет, то Неопределено
СтороныСвета = Новый Массив;
СтороныСвета.Добавить("Север");
СтороныСвета.Добавить("Юг");
ИндексЭлементаЮг = СтороныСвета.Найти("Юг");
Сообщить(ИндексЭлементаЮг); // 1
6. Очистить()
Удаляет все элементы массива
СтороныСвета = Новый Массив;
СтороныСвета.Добавить("Север");
СтороныСвета.Добавить("Юг");
СтороныСвета.Очистить();
КоличествоЭлементов = СтороныСвета.Количество();
Сообщить(КоличествоЭлементов); // 0
7. Получить(<Индекс>)
- <Индекс> (обязательный) - Число - индекс элемента
Получает произвольное значение аналогично оператору [..].
СтороныСвета = Новый Массив;
СтороныСвета.Добавить("Север");
СтороныСвета.Добавить("Юг");
Юг = СтороныСвета.Получить(1);
Сообщить(Юг)
8. Удалить(<Индекс>)
- <Индекс> (обязательный) - Число - индекс элемента
Удаляет элемент массива с указанным индексом. После удаления, следующий по порядку элемент получает индекс предыдущего и т.д все элементы получают новые индексы, общее количество элементов уменьшается на один.
СтороныСвета = Новый Массив;
СтороныСвета.Добавить("Север"); // Индекс - 0
СтороныСвета.Добавить("Юг"); // Индекс - 1
СтороныСвета.Добавить("Запад"); // Индекс - 2
СтороныСвета.Добавить("Восток"); // Индекс - 3
СтороныСвета.Удалить(1);
Сообщить(СтороныСвета[0]); // Север, Индекс - 0
Сообщить(СтороныСвета[1]); // Запад, Индекс - 1
Сообщить(СтороныСвета[2]); // Восток, Индекс - 2
9. Установить(<Индекс>, <Значение>)
- <Индекс> (обязательный) - Число - индекс элемента.
- <Значение> (обязательный) - Произвольный - присваиваемое значение.
Устанавливает у элемента с <Индекс> значение <Значение>, аналогично оператору [..]
СтороныСвета = Новый Массив(2);
СтороныСвета.Установить(1, "Юг");
Юг = СтороныСвета[1];
Сообщить(Юг); // Юг
Фиксированный массив
У фиксированного массива 4 метода: ВГраница(), Количество(), Найти(<Значение>), Получить(<Индекс>). Работают они аналогично. В фиксированном массиве нельзя удалить, установить или как-то иначе изменить значения.
Фиксированный массив создается на основе обычного массива.
Счета = Новый Массив;
Счета.Добавить("50");
Счета.Добавить("51");
АктивныеСчета = Новый ФиксированныйМассив(Счета);
Для Каждого Счет Из АктивныеСчета Цикл
Сообщить(Счет);
КонецЦикла;
Примеры
1. Обойти все элементы массива по порядку
СтороныСвета = Новый Массив;
СтороныСвета.Добавить("Север");
СтороныСвета.Добавить("Юг");
СтороныСвета.Добавить("Запад");
СтороныСвета.Добавить("Восток");
Для Каждого Направление Из СтороныСвета Цикл
Сообщить(Направление);
КонецЦикла;
2. Обойти элементы массива начиная с последнего
СтороныСвета = Новый Массив;
СтороныСвета.Добавить("Север");
СтороныСвета.Добавить("Юг");
СтороныСвета.Добавить("Запад");
СтороныСвета.Добавить("Восток");
НаибольшийИндекс = СтороныСвета.ВГраница();
Для Индекс = 0 По НаибольшийИндекс Цикл
Направление = СтороныСвета[НаибольшийИндекс - Индекс];
Сообщить(Направление);
КонецЦикла;
3. Удалить каждый второй элемент массива.
Обходить массив желательно с последнего элемента т.к значение индексов после каждого удаления будет меняться и при обходе начиная с первого некоторые элементы могут быть пропущены
СтороныСвета = Новый Массив;
СтороныСвета.Добавить("Север");
СтороныСвета.Добавить("Юг");
СтороныСвета.Добавить("Запад");
СтороныСвета.Добавить("Восток");
НаибольшийИндекс = СтороныСвета.ВГраница();
Счет = 0;
Для Индекс = 0 По НаибольшийИндекс Цикл
Счет = Счет + 1;
Если Счет = 2 Тогда
СтороныСвета.Удалить(НаибольшийИндекс - Индекс);
Счет = 0;
КонецЕсли;
КонецЦикла;
Для Каждого Направление Из СтороныСвета Цикл
Сообщить(Направление);
КонецЦикла;
4. Удалить дубли из массива
Решение задачи способом создания нового массива без дублей
СтороныСвета = Новый Массив;
СтороныСвета.Добавить("Север");
СтороныСвета.Добавить("Юг");
СтороныСвета.Добавить("Юг");
СтороныСвета.Добавить("Запад");
СтороныСвета.Добавить("Восток");
СтороныСвета.Добавить("Восток");
СтороныСветаБезДублей = Новый Массив;
Для Каждого Направление Из СтороныСвета Цикл
Если СтороныСветаБезДублей.Найти(Направление) = Неопределено Тогда
СтороныСветаБезДублей.Добавить(Направление);
Сообщить(Направление);
КонецЕсли;
КонецЦикла;
5. Отсортировать элементы массива
У массива нет метода сортировки, поэтому можно сделать сортировку, используя известные алгоритмы сортировки (например, «Пузырьковая сортировка»), или использовать другие объекты, в которых метод сортировки присутствует.
Числа = Новый Массив;
Числа.Добавить(3);
Числа.Добавить(5);
Числа.Добавить(0);
Числа.Добавить(1);
Числа.Добавить(4);
Числа.Добавить(2);
СписокЗначений = Новый СписокЗначений;
СписокЗначений.ЗагрузитьЗначения(Числа);
СписокЗначений.СортироватьПоЗначению(НаправлениеСортировки.Убыв); // СписокЗначений.СортироватьПоЗначению(НаправлениеСортировки.Возр);
ЧислаПоУбыванию = СписокЗначений.ВыгрузитьЗначения();
Для Каждого Число Из ЧислаПоУбыванию Цикл
Сообщить(Число);
КонецЦикла;
6. Дополнить массив (ТоварыМагазин) уникальными значениями (из ТоварыСклад)
ТоварыМагазин = Новый Массив;
ТоварыМагазин.Добавить("Ручка");
ТоварыМагазин.Добавить("Книга");
ТоварыМагазин.Добавить("Стол");
ТоварыСклад = Новый Массив;
ТоварыСклад.Добавить("Ручка");
ТоварыСклад.Добавить("Книга");
ТоварыСклад.Добавить("Стол");
ТоварыСклад.Добавить("Стул");
Для Каждого Товар Из ТоварыСклад Цикл
Если ТоварыМагазин.Найти(Товар) = Неопределено Тогда
ТоварыМагазин.Добавить(Товар);
КонецЕсли;
КонецЦикла;
Для Каждого Товар Из ТоварыМагазин Цикл
Сообщить(Товар);
КонецЦикла;
7. Найти все элементы первого массива (ТоварыМагазин), не существующие во втором (ТоварыСклад)
ТоварыМагазин = Новый Массив;
ТоварыМагазин.Добавить("Ручка");
ТоварыМагазин.Добавить("Книга");
ТоварыМагазин.Добавить("Стол");
ТоварыСклад = Новый Массив;
ТоварыСклад.Добавить("Ручка");
ТоварыСклад.Добавить("Книга");
ТоварыСклад.Добавить("Стол");
ТоварыСклад.Добавить("Стул");
Результат = Новый Массив;
Для Каждого Элемент Из ТоварыСклад Цикл
Если ТоварыМагазин.Найти(Элемент) = Неопределено Тогда
Результат.Добавить(Элемент);
КонецЕсли;
КонецЦикла;
Для Каждого Элемент Из Результат Цикл
Сообщить(Элемент);
КонецЦикла;
8. Сформировать матрицу чисел 3 на 3 и вычислить произведение одной из ее диагоналей
// Массив содержащий 3 массива, каждый из которых содержит по 3 элемента
Матрица = Новый Массив(3, 3);
// 1. Заполнение матрицы числами по порядку
// [1][2][3]
// [4][5][6]
// [7][8][9]
Сч = 0;
Для Каждого СтрокаМатрицы Из Матрица Цикл
Для НомерКолонки = 0 По СтрокаМатрицы.ВГраница() Цикл
Сч = Сч + 1;
СтрокаМатрицы[НомерКолонки] = Сч;
КонецЦикла;
КонецЦикла;
// 2. Вычисление произведения следующей диагонали
// [1][ ][ ]
// [ ][5][ ]
// [ ][ ][9]
//
// 1 * 5 * 9 = 45
//
// Первые операторные скобки получают значение первого массива, вторые второго
Результат = Матрица[0][0] * Матрица[1][1] * Матрица[2][2];
// 2. Вывод результата и матрицы
Для Каждого СтрокаМатрицы Из Матрица Цикл
Строка = "";
Для Каждого КолонкаМатрицы Из СтрокаМатрицы Цикл
Строка = Строка + "[" + КолонкаМатрицы + "]";
КонецЦикла;
Сообщить(Строка);
КонецЦикла;
Сообщить(Результат);
9. Скопировать массив
Исходный = Новый Массив;
Исходный.Добавить("Текст");
Исходный.Добавить(123);
Исходный.Добавить(Истина);
Скопированный = Новый Массив(Новый ФиксированныйМассив(Исходный));
Для Каждого Элемент Из Скопированный Цикл
Сообщить(Элемент);
КонецЦикла;