0
DeMi4
29.08.12
✎
09:31
|
Есть таблица значений с разными кодами надо из нее получить значения
Например
1
2
3
4
10
11
12
15
Получить ТЗ следующего вида
1-4
10-12
15
Подскажите как можно так перебрать
Вот то что пришло в голову мне
тзДиапозоны = СоздатьОбъект( "ТаблицаЗначений" );
тзДиапозоны.НоваяКолонка( "НачалоДиапозона" );
тзДиапозоны.НоваяКолонка( "КонецДиапозона" );
тзДиапозоны.НоваяКолонка( "ШиринаДиапозона" );
НачалоДиапозона = тзДК.ПолучитьЗначение(1,1);
КонецДиапозона = тзДК.ПолучитьЗначение(1,1);
КолСтрокТЗ = тзДК.КоличествоСтрок();
Для НС = 2 По КолСтрокТЗ Цикл
тзДК.ПолучитьСтрокуПоНомеру( НС );
Если ( тзДК.КодКарты = КонецДиапозона + 1 ) И (НС <> КолСтрокТЗ) Тогда
КонецДиапозона = тзДК.КодКарты;
Иначе
тзДиапозоны.НоваяСтрока();
тзДиапозоны.НачалоДиапозона = НачалоДиапозона;
тзДиапозоны.КонецДиапозона = КонецДиапозона;
тзДиапозоны.ШиринаДиапозона = тзДиапозоны.КонецДиапозона - тзДиапозоны.НачалоДиапозона + 1;
НачалоДиапозона = тзДК.КодКарты;
КонецДиапозона = тзДК.КодКарты;
КонецЕсли;
КонецЦикла;
|
|
4
andrewks
29.08.12
✎
09:41
|
1. сортируешь
2. двигаешься по ТЗ1, параллельно заполняя ТЗ2:
пусть нумерация с 1, код алгоритмический
ПредЗнач=ТЗ1[1].Код-100;
Для нс=1 по КолвоСтрок Цикл
ТекЗнач=ТЗ1[нс];
Если (ТекЗнач>ПредЗнач+1) Тогда
ТЗ2.НоваяСтрока();
ТЗ2[НомерТекущейСтроки].НачКод=ТекЗнач;
ТЗ2[НомерТекущейСтроки].КонКод=ТекЗнач;
Иначе
ТЗ2[НомерТекущейСтроки].КонКод=ТекЗнач;
КонецЕсли;
ПредЗнач=ТекЗнач;
КонецЦикла;
|
|
5
vcv
29.08.12
✎
09:47
|
Если стоит проблема с размером таблицы и быстродействием, можно попробовать перебирать не каждый элемент, а, например, через пять. Если, например, ТЗ.ПолучитьЗначение(Позиция+5,1)=ТЗ.ПолучитьЗначение(Позиция,1)+5, значит диапазон еще не закончился, нужно идти дальше. Можно попробовать дихотомией таблицу делить...
|
|