2

Как свернуть массив?

У этой задачи есть два варианта решения:

А. Свертка элементов массива перебором

Замысел таков: будем перебирать элементы исходного массива и переносить их во вспомогательный массив, контролируя уникальность элементов. Для этого мы воспользуемся методом Массив.Найти():

Массив = Новый Массив;
Массив.Добавить(1);
Массив.Добавить(2);
Массив.Добавить(3);
Массив.Добавить(2);

//добавим вспомогательный массив
СвернутыйМассив = Новый Массив;

Для каждого Элемент Из Массив Цикл
	Если СвернутыйМассив.Найти(Элемент) = Неопределено Тогда
		//если такого значения в массиве еще нет, добавим его
		СвернутыйМассив.Добавить(Элемент);
	КонецЕсли;
КонецЦикла;

Сообщить(СтрСоединить(СвернутыйМассив, ","));
//	1,2,3

Б. Свертка элементов массива через таблицу значений

Замысел этого решения заключается в использовании вспомогательной таблицы с одной единственной колонкой произвольного типа. Далее, используя метод ТаблицаЗначений.Свернуть(), мы получим набор уникальных значений, которые в дальнейшем сможем отсортировать и выгрузить обратно в исходный массив.

Массив = Новый Массив;
Массив.Добавить(1);
Массив.Добавить(2);
Массив.Добавить(3);
Массив.Добавить(2);

//создадим вспомогательную таблицу
ВспомогательнаяТаблица = Новый ТаблицаЗначений;
//добавим одну единственную колонку
ВспомогательнаяТаблица.Колонки.Добавить("Значение");

//добавим строки в таблицу по количеству элементов массива
Для Инд = 0 По Массив.ВГраница() Цикл
	ВспомогательнаяТаблица.Добавить();
КонецЦикла;

//загружаем значения из массива в колонку таблицы 
ВспомогательнаяТаблица.ЗагрузитьКолонку(Массив, "Значение");
//сворачиваем значения в колонке
ВспомогательнаяТаблица.Свернуть("Значение");
//дополнительно можем отсортировать их
ВспомогательнаяТаблица.Сортировать("Значение");

//выгрузим значения из таблицы в массив
Массив = ВспомогательнаяТаблица.ВыгрузитьКолонку("Значение");

Сообщить(СтрСоединить(Массив, ","));
//	1,2,3

PS: Последнее решение мне кажется более интересным за счет использования более эффективного кода.

Комментарии

  1. Через таблицу значений работает быстрее.
    Сделал массив 200 тысяч элементов 1,1,2,2,3,4….и так далее
    первый способ 273 секунды, второй 1.7 секунд.

    • Спасибо за опыт! Оно и понятно: поиск в массиве заключается в полным последовательным переборе всех элементов и время выполнения напрямую зависит от числа уникальных элементов. Свертка через таблицу работает быстрее, т.к. метод реализован на уровне платформы, а не исполняется транслятором…

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *