2

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

PS: Последнее решение мне кажется более интересным за счет использования более эффективного кода. С другой стороны, если известно, что потребуется получить список уникальных значений, лучше сразу добавлять их в таблицу значений для последующей свертки

Поделиться страницей в соц.сетях

Метки: Метки

2 комментария к записи “Как свернуть массив?

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

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

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

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