|
|
|
Свернуть список значений | ☑ | ||
|---|---|---|---|---|
|
0
MagTux
11.04.11
✎
16:56
|
Доброго времени суток!
Я так понимаю, что не существует штатной процедуры свёртки списка значений (удаления дубликатов). Я сворачиваю список так: СП.Сортировать(); ТемпЗнач=СП.ПолучитьЗначение(1); Для Н=2 по СП.РазмерСписка() цикл Попытка СПЗнач=СП.ПолучитьЗначение(Н); Исключение Прервать; КонецПопытки; Если СПЗнач=ТемпЗнач Тогда СП.УдалитьЗначение(Н); Н=Н-1; Иначе ТемпЗнач=СПЗнач; КонецЕсли; КонецЦикла; На моём списке в 19111 символьных строк такая процедура отрабатывает 35 секунд, а если пользоваться таблицей значений с одной колонкой и процедурой Свернуть(), то свёртка продолжается 21 миллисекунду. Существует ли такой же быстрый способ свернуть список не прибегая к использованию таблицы значений? Спасибо! |
|||
|
1
andrewks
11.04.11
✎
16:57
|
Заполнить()
Свернуть() Выгрузить() |
|||
|
2
zak555
11.04.11
✎
16:57
|
зачем попытка ?
|
|||
|
3
andrewks
11.04.11
✎
17:00
|
(2) ну как это! он в цикле удаляет эл-ты списка, а проход при этом использует _прямой_
|
|||
|
4
MagTux
11.04.11
✎
17:00
|
(2) Список то уменьшается. Можно использовать дополнительную переменную, но так вроде, лучше.
|
|||
|
5
andrewks
11.04.11
✎
17:00
|
(4) лучше кому?
|
|||
|
6
Mikeware
11.04.11
✎
17:01
|
(5) "не поможет"...
пропорция радиусов такова, что не поможет... |
|||
|
7
zak555
11.04.11
✎
17:02
|
(4) удалить сзада ?
|
|||
|
8
andrewks
11.04.11
✎
17:03
|
(7) сзадУ :-)
а вообще - я уже ему сказал, как нормально - перегнать в ТЗ, свернуть и выгрузить |
|||
|
9
zak555
11.04.11
✎
17:04
|
(8) так он опять в (1) будет использовать (2)
|
|||
|
10
andrewks
11.04.11
✎
17:07
|
СП.Сортировать();
Для нз=-СП.РазмерСписка() По -2 Цикл ТекЗнач=СП.ПолучитьЗначение(-нз); ПредЗнач=СП.ПолучитьЗначение(-нз+1); Если ТекЗнач=ПредЗнач Тогда СП.УдалитьЗначение(-нз); КонецЕсли; КонецЦикла; |
|||
|
11
MagTux
11.04.11
✎
17:08
|
(6) Нормальные радиусы.
(10) Спасибо, но через ТЗ всё-равно быстрее. |
|||
|
12
andrewks
11.04.11
✎
17:08
|
(11) и?
|
|||
|
13
Ёпрст
гуру
11.04.11
✎
17:11
|
(11)
select * distinct from #врСписок |
|||
|
14
Lepochkin
12.04.11
✎
11:01
|
Может проще на момент добавления проверить, а нет ли там этого значения методом Принадлежит()??? Лишних телодвижений делать не надо будет
|
|||
|
15
Simod
12.04.11
✎
11:41
|
// сз_СписокЗначений - твой список значений
// будет работать для сортированых и не сортированых списков, для сортированных быстрее сз_Дубликат = СоздатьОбъект("СписокЗначений"); п_КоличествоЗначений = сз_СписокЗначений.РазмерСписка(); Если п_КоличествоЗначений > 1 Тогда п_Значение = сз_СписокЗначений.ПолучитьЗначение(1); сз_Дубликат.ДобавитьЗначение(п_Значение); Для п_Позиция = 2 По п_КоличествоЗначений Цикл п_ТекЗначение = сз_СписокЗначений.ПолучитьЗначение(п_Позиция); Если п_Значение <> п_ТекЗначение Тогда п_Значение = п_ТекЗначение; Если сз_Дубликат.НайтиЗначение(п_Значение) = 0 Тогда сз_Дубликат.ДобавитьЗначение(п_Значение); КонецЕсли; КонецЕсли; КонецЦикла; сз_СписокЗначений = сз_Дубликат; КонецЕсли; |
|||
|
16
MagTux
12.04.11
✎
13:14
|
(15) Такой вариант у меня отработал быстрее, чем (1).
Но если изначально пользоваться ТЗ вместо списка, то ТЗ всё-равно быстрее сворачивается. Вероятно, это из-за типизированных полей. Умнее всего будет делать (14). Хотя не всегда возможно. Спасибо всем! |
|||
|
17
segabuben
12.04.11
✎
15:25
|
(0), (15) с ТаблицейЗначений завсегда быстрей. и кода немного совсем.
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |