Имя: Пароль:
1C
1С v8
Вывести уникальные значения массива
0 Дмитрий96_2016
 
24.04.16
17:26
Создаю массив с повторяющимися элементами.Нужно вывести только не повторющиеся

Процедура Массив(Команда)
    НовыйМассив= Новый Массив;
    
НовыйМассив.Добавить(  "1") ;
НовыйМассив.Добавить(  "2") ;
НовыйМассив.Добавить(  "2") ;
НовыйМассив.Добавить(  "3") ;
НовыйМассив.Добавить(  "4") ;
НовыйМассив.Добавить(  "4") ;


ТекущийИндекс = 0;
        ВсегоЭлементов = НовыйМассив.Количество();
        Пока ТекущийИндекс < ВсегоЭлементов Цикл
            Индекс2 = ТекущийИндекс + 1;
            Пока Индекс2 < ВсегоЭлементов Цикл
                Если НовыйМассив[Индекс2] = НовыйМассив[ТекущийИндекс] Тогда
                    
                    НовыйМассив.Удалить(ТекущийИндекс);
                    НовыйМассив.Удалить(Индекс2);
                    ВсегоЭлементов = ВсегоЭлементов - 1;
                Иначе
                    Индекс2 = Индекс2 + 1;
                КонецЕсли;
            КонецЦикла;
            ТекущийИндекс = ТекущийИндекс + 1;
        КонецЦикла;

Для Каждого ЭлементМассива из НовыйМассив Цикл
    Сообщить(ЭлементМассива);
КонецЦикла;
КонецПроцедуры
1 Zhuravlik
 
24.04.16
17:31
Создай новый без повторяющихся, и обойди его...
2 Дмитрий96_2016
 
24.04.16
17:34
Это слишком легко. Задача состоит в том,чтобы выбрать не повторяющиеся
3 zenik
 
24.04.16
17:36
в ТЗ и свернуть()
4 Дмитрий96_2016
 
24.04.16
17:39
не понятно...
5 zenik
 
24.04.16
17:44
ТЗ = ТаблицаЗначений
У нее есть процедура "свернуть". в результате останутся только уникальные значения.
6 Дмитрий96_2016
 
24.04.16
17:49
это в цикл добавить?или цикл вообще удалить?
7 zenik
 
24.04.16
17:56
(6) в цикле заполнить таблицу, после цикла - свернуть.
8 Дмитрий96_2016
 
24.04.16
18:00
а как быть с массивом?
9 Chameleon1980
 
24.04.16
18:01
либо свернуть тз.
либо создать не уникальный массив и вывести
либо при выводе массива сохранять (например еще в один массив) сохранять уже выведенные, ну и перед каждым выводом очередного элемента массива 1 проверять в зарегистрированных уже выведенных
10 Chameleon1980
 
24.04.16
18:03
но самое простое ИМХО
-----------------------------------
ТаблицаЗначений.ЗагрузитьКолонку (ValueTable.LoadColumn)
ТаблицаЗначений (ValueTable)
ЗагрузитьКолонку (LoadColumn)
Синтаксис:

ЗагрузитьКолонку(<Массив>, <Колонка>)
Параметры:

<Массив> (обязательный)

Тип: Массив.
Массив значений, который выступает в качестве источника данных для колонки.
<Колонка> (обязательный)

Тип: Число; Строка; КолонкаТаблицыЗначений.
Колонка, в которую будут загружены значения из массива. В качестве значения параметра может выступать индекс колонки, имя колонки, сама колонка.
Описание:

Загружает колонку таблицы значений из массива значений.

Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Примечание:

Значения из массива загружаются в колонку в порядке индексов.
Пример:

ТаблицаРезультат = Новый ТаблицаЗначений;
Для каждого ИмяКолонки Из МассивИменКолонок Цикл
    ТаблицаРезультат.Колонки.Добавить(ИмяКолонки);
КонецЦикла;

// Создадим пустые строки таблицы

Для Н=1 По СтрокиДереваЗначений.Количество() Цикл
    ТаблицаРезультат.Добавить();
КонецЦикла;

// Скопируем значения колонок

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

--------------------------------

ТаблицаЗначений.Свернуть (ValueTable.GroupBy)
ТаблицаЗначений (ValueTable)
Свернуть (GroupBy)
Синтаксис:

Свернуть(<КолонкиГруппировок>, <КолонкиСуммирования>)
Параметры:

<КолонкиГруппировок> (обязательный)

Тип: Строка.
Имена колонок, разделенные запятыми, по которым необходимо группировать строки таблицы значений.
<КолонкиСуммирования> (необязательный)

Тип: Строка.
Имена колонок, разделенные запятыми, по которым необходимо суммировать значения в строках таблицы значений.
Описание:

Осуществляет свертку таблицы значений по указанным колонкам группировки. Строки, у которых совпадают значения в колонках, указанных в первом параметре, сворачиваются в одну строку. Значения этих строк, хранящиеся в колонках, указанных во втором параметре, накапливаются.
Важно! Списки колонок не должны пересекаться. Колонки, не вошедшие ни в один из списков колонок, после выполнения метода удаляются из таблицы значений.

Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Примечание:

Если в колонке установлен тип и он единственный, то при суммировании будет предприниматься попытка преобразования значения к типу Число.
Если колонке не присвоены типы, то в процессе суммирования будут принимать участие только значения, имеющие тип Число, значения других типов будут игнорироваться.
Если в колонке несколько типов и среди них есть тип Число, то в процессе суммирования будут принимать участие только значения, имеющие тип Число, значения других типов будут игнорироваться.
Если в колонке несколько типов и среди них нет типа Число, то результат суммирования будет 0, который будет присвоен в соответствующую колонку, где будет преобразован к значению по умолчанию для типа, установленного в колонке.
Пример:

ТаблицаЦен.Свернуть("Товар, Валюта", "Цена");
11 PR пять
 
24.04.16
18:35
(0) Обойди массив с конца.
Если поиск по значению находит элемент и это не текущий, то удаляй.
12 mingw
 
24.04.16
18:42
ТС перефразируй задачу. Нужно узнать число повторов элементов.
Перенос в ТЗ. Добавление колонки. Отдельной с количеством. Заполненной 1.
ТЗ.Свернуть("Элементы","Количество");

Или запросами. Ими прикольнее.
13 Лефмихалыч
 
24.04.16
18:49
триавиально
Функция ВернутьУникальные(МассивНеуникальных)
   Результат = Новый Массив;
   Кэш = Новый Соответствие;
   Для каждого Элемент из МассивНеуникальных Цикл
      Если Кэш[Элемент]=неопределено Тогда
          Кэш[Элемент] = Истина;
          Результат.Добавить(Элемент);
      КонецЕсли;
   КонецЦикла;
   Возврат Результат;
КонецФункции
14 Лефмихалыч
 
24.04.16
18:50
(11) окуеть...
15 D_Pavel
 
24.04.16
19:41
(13) Таким способом в выходной массив попадут элементы которые повторялись в исходном массиве. В задаче (0) сказано что нужно вывести только не повторяющиеся.

Без счетчика не обойтись.

Нужно пройти по массиву циклом, запомнить для каждого значения сколько раз оно повторялось в соответствие.

Потом пройти по соответствию вторым циклом и вывести только те значения, у которых число повторений равно 1ю
16 D_Pavel
 
24.04.16
19:43
(12) Вот, нормальный вариант
17 PR пять
 
24.04.16
19:45
(15) Чет не понял, то есть ТС нужно только те элементы, которые в единственном экземпляре?
Я думал, он свернуть хочет.
18 Лефмихалыч
 
24.04.16
19:45
(15) тогда в соответствии не истину записывать, а количество считать по каждому значению, и результат заполнять обходом соответствия.
19 D_Pavel
 
24.04.16
19:47
(0) Чтобы более оптимально решить твою задачу, нужно больше данных.

1. Значения в массиве отсортированы?
2. Какой диапазон значений? Сколько вообще различных вариантов может быть? (от 1 до 10 или от 1 до 10000000 или вообще числа не целые и вариантов очень много?) От этого зависит какое решение задачи будет самым оптимальным при больших размерах массива.
20 D_Pavel
 
24.04.16
19:48
(18) А я как написал?
21 PR пять
 
24.04.16
19:52
Если нужно (15), то вместо (11):
Обойди массив с конца.
Если поиск по значению находит элемент и это не текущий, то удаляй в цикле все элементы с таким значением, включая текущий. Не забывая делать корректировку на удаленное количество элементов.
22 D_Pavel
 
24.04.16
19:53
(17) Свернуть - слишком просто. В (2) так и написано.
23 PR пять
 
24.04.16
19:56
(22) Да в (2) нихрена непонятно написано, что там ему просто.
То ли слишком просто сразу сделать правильно, то ли слишком просто было бы, если бы была такая задача, а у него мол другая задача, более сложная.
24 D_Pavel
 
24.04.16
19:56
(21) Это очень плохой вариант. О(N^2) по быстродействию.
В то время как я предложил вариант О(N)
25 D_Pavel
 
24.04.16
20:00
Мне кажется что массив вообще отсортирован, и задачу можно решить за один проход и без использования дополнительной памяти под служебный массив.
26 D_Pavel
 
24.04.16
20:00
(24) Хотя этот вариант предлагали и до меня.
27 Лефмихалыч
 
24.04.16
20:05
(20) не знаю - мне лень читать дальше первых двух строк :)
28 D_Pavel
 
24.04.16
20:07
(27) Если бы не ленился, не пришлось бы печатать лишнее.
29 PR пять
 
24.04.16
20:14
(24) Откуда ты вдруг квадрат взял?
30 D_Pavel
 
24.04.16
20:21
(29) Поиск по массиву в твоем варианте есть. Это тоже операция зависящая по времени от длины массива.
31 D_Pavel
 
24.04.16
20:24
+(30) Это я еще не учел как 1С удаляет элементы в середине массива. Не думаю что она на столько тупая что сдвигает все элементы в памяти, но кто ее знает наверняка...
32 PR пять
 
24.04.16
20:29
(31) С соответствием да, легче алгоритм должен быть, да.
Ошибка? Это не ошибка, это системная функция.