У этой задачи есть два варианта решения:
А. Свертка элементов массива перебором
Замысел таков: будем перебирать элементы исходного массива и переносить их во вспомогательный массив, контролируя уникальность элементов. Для этого мы воспользуемся методом Массив.Найти():
Массив = Новый Массив; Массив.Добавить(1); Массив.Добавить(2); Массив.Добавить(3); Массив.Добавить(2); //добавим вспомогательный массив СвернутыйМассив = Новый Массив; Для каждого Элемент Из Массив Цикл Если СвернутыйМассив.Найти(Элемент) = Неопределено Тогда //если такого значения в массиве еще нет, добавим его СвернутыйМассив.Добавить(Элемент); КонецЕсли; КонецЦикла; Сообщить(СтрСоединить(СвернутыйМассив, ",")); // 1,2,3
Б. Свертка элементов массива через таблицу значений
Замысел этого решения заключается в использовании вспомогательной таблицы значений с одной единственной колонкой произвольного типа. Далее, используя метод ТаблицаЗначений.Свернуть(), мы получим набор уникальных значений, которые в дальнейшем сможем отсортировать и выгрузить обратно в исходный массив.
Массив = Новый Массив; Массив.Добавить(1); Массив.Добавить(2); Массив.Добавить(3); Массив.Добавить(2); //создадим вспомогательную таблицу ВспомогательнаяТаблица = Новый ТаблицаЗначений; //добавим одну единственную колонку ВспомогательнаяТаблица.Колонки.Добавить("Значение"); //добавим строки в таблицу по количеству элементов массива Для Инд = 0 По Массив.ВГраница() Цикл ВспомогательнаяТаблица.Добавить(); КонецЦикла; //загружаем значения из массива в колонку таблицы ВспомогательнаяТаблица.ЗагрузитьКолонку(Массив, "Значение"); //сворачиваем значения в колонке ВспомогательнаяТаблица.Свернуть("Значение"); //дополнительно можем отсортировать их ВспомогательнаяТаблица.Сортировать("Значение"); //выгрузим значения из таблицы в массив Массив = ВспомогательнаяТаблица.ВыгрузитьКолонку("Значение"); Сообщить(СтрСоединить(Массив, ",")); // 1,2,3
PS: Последнее решение мне кажется более интересным за счет использования более эффективного кода. С другой стороны, если известно, что потребуется получить список уникальных значений, лучше сразу добавлять их в таблицу значений для последующей свертки
Поделиться страницей в соц.сетях
Через таблицу значений работает быстрее.
Сделал массив 200 тысяч элементов 1,1,2,2,3,4….и так далее
первый способ 273 секунды, второй 1.7 секунд.
Спасибо за опыт! Оно и понятно: поиск в массиве заключается в полным последовательным переборе всех элементов и время выполнения напрямую зависит от числа уникальных элементов. Свертка через таблицу работает быстрее, т.к. метод реализован на уровне платформы, а не исполняется транслятором…