|
Вывести уникальные значения массива | ☑ | ||
---|---|---|---|---|
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) С соответствием да, легче алгоритм должен быть, да.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |