Difference between revisions of "Tab.AddLineSorted"
m (1 revision imported) |
1>Admin |
||
Line 13: | Line 13: | ||
* [[Объекты]] | * [[Объекты]] | ||
* [[Таблица]]}} | * [[Таблица]]}} | ||
− | Функция добавляет новую строку и помечает ее как текущую (т.е. атрибут [[Tab.CurLine|CurLine]] изменяется на индекс добавленной строки). Указанные во втором аргументе столбцы таблицы, в добавленной строке будут заполнены значениями, заданными последующими аргументами. Строка вставляется в таблицу таким образом, чтобы не нарушить сортировку, заданную наименованиями столбцов первого аргумента. '''Важно''': таблица должна быть отсортирована по всем столбцам сортировки последовательно (т.е., должна быть проведена операция <code>aTab.Sort(<Наименования столбцов сортировки через запятую (STRING)></code>, если таблица была не сортирована | + | Функция добавляет новую строку и помечает ее как текущую (т.е. атрибут [[Tab.CurLine|CurLine]] изменяется на индекс добавленной строки). Указанные во втором аргументе столбцы таблицы, в добавленной строке будут заполнены значениями, заданными последующими аргументами. Строка вставляется в таблицу таким образом, чтобы не нарушить сортировку, заданную наименованиями столбцов первого аргумента. '''Важно''': таблица должна быть отсортирована по всем столбцам сортировки последовательно (т.е., должна быть проведена операция <code>aTab.Sort(<Наименования столбцов сортировки через запятую (STRING)>)</code>, если таблица была не сортирована), иначе сохранение порядка сортировки не будет работать корректно. '''Важно''': все столбцы сортировки должны присутствовать в столбцах добавления (порядок не важен). Данная функция может использоваться при необходимости последовательного добавления строк в таблицу, для которой важна сортировка (к примеру, будет использоваться функция Find с флагом сортировки. Как альтернатива, таблицу можно отсортировать перед началом блока с поиском, но в случае, если в одном блоке происходит и добавление строк и поиск строк по элементам, данный режим будет работать гораздо быстрее, чем последовательные вызовы сортировки перед каждым поиском (см. пример ниже). |
== Синтаксис == | == Синтаксис == |
Revision as of 15:37, 19 December 2021
AddLineSorted (Работа со строками) | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Функция добавляет новую строку и помечает ее как текущую (т.е. атрибут CurLine изменяется на индекс добавленной строки). Указанные во втором аргументе столбцы таблицы, в добавленной строке будут заполнены значениями, заданными последующими аргументами. Строка вставляется в таблицу таким образом, чтобы не нарушить сортировку, заданную наименованиями столбцов первого аргумента. Важно: таблица должна быть отсортирована по всем столбцам сортировки последовательно (т.е., должна быть проведена операция aTab.Sort(<Наименования столбцов сортировки через запятую (STRING)>)
, если таблица была не сортирована), иначе сохранение порядка сортировки не будет работать корректно. Важно: все столбцы сортировки должны присутствовать в столбцах добавления (порядок не важен). Данная функция может использоваться при необходимости последовательного добавления строк в таблицу, для которой важна сортировка (к примеру, будет использоваться функция Find с флагом сортировки. Как альтернатива, таблицу можно отсортировать перед началом блока с поиском, но в случае, если в одном блоке происходит и добавление строк и поиск строк по элементам, данный режим будет работать гораздо быстрее, чем последовательные вызовы сортировки перед каждым поиском (см. пример ниже).
Синтаксис
Tab.AddLineSorted(<Наименования столбцов сортировки через запятую (STRING)>,<Наименования столбцов добавления через запятую (STRING)>,<Значение столбца 1>,<Значение столбца 2>...)
Аргументы
<Наименования столбцов сортировки через запятую (STRING)>
- Наименования столбцов сортировки, разделенные запятой. Заполняемые столбцы могут не совпадать со столбцами сортировки, однако, все столбца сортировки должны входить в список столбцов добавления, иначе функция не сможет получить все значения, необходимые для нахождения индекса новой строки.<Наименования столбцов добавления через запятую (STRING)>
- Наименования столбцов для заполнения, разделенные запятой. Количество наименований должно совпадать с количеством аргументов, следующих за данным.<Значение столбца ?>
- (необязательный аргумент) Значения произвольного типа, которыми будут заполнены ячейки новой строки таблицы в столбцах, перечисленных во втором аргументе.
Примеры
//Создается и заполняется таблица значений aTab:=Tab.Create("b1,b2,b3,b4"); aTab.AddLine("b1,b2,b3,b4",1,2,3,4); aTab.AddLine("b1,b2,b3,b4",2,2,3,4); aTab.AddLine("b1,b2,b3,b4",3,5,5,4); aTab.AddLine("b1,b2,b3,b4",4,2,3,4); aTab.AddLine("b1,b2,b3,b4",4,2,3,4); aTab.AddLine("b1,b2,b3,b4",5,2,3,4); aTab.AddLineSorted("b1,b2","b1,b2,b3,b4",2,1,3,4); Message(aTab.CurLine); //Выводит число 2 (была добавлена строка с индексом 2)
Сравнение скорости работы функций с сортировкой и функций без сортировки
Данный пример сравнивает скорость работы функции FindAndGoto для сортированной и не сортированной таблиц. Внутри цикла поиска также происходит увеличение массива с помощью функции AddLineSorted для проверки корректности ее работы.
См. также Пример поиска множества значений в сортированных таблицах.
ProfilerClear(); ProfilerStart(); randomize(1); aTab:=Tab.Create("Col1,Col2,Col3"); For i:=1 To 100000 Do aTab.AddLineSorted("Col1","Col1,Col2,Col3",Random(10000),Random(10000),Random(10000)); EndDo; For i:=1 To 10000 Do j:=Random(aTab.Size())+1; aCol1:=aTab.Get(j,"Col1"); While _And(j>1,aTab.Get(j-1,"Col1")=aCol1) Do j:=j-1; EndDo; aTab.FindAndGoto(aCol1,,"Col1",1); If j<>aTab.CurLine Then Message("Проблема при поиске значения!","!"); EndIf; //Добавление случайного значения внутри цикла поиска aTab.AddLineSorted("Col1","Col1,Col2,Col3",Random(10000),Random(10000),Random(10000)); EndDo; randomize(1); aTab:=Tab.Create("Col1,Col2,Col3"); For i:=1 To 100000 Do aTab.AddLine("Col1,Col2,Col3",Random(10000),Random(10000),Random(10000)); EndDo; aTab.Sort("Col1"); For i:=1 To 10000 Do j:=Random(aTab.Size())+1; aCol1:=aTab.Get(j,"Col1"); While _And(j>1,aTab.Get(j-1,"Col1")=aCol1) Do j:=j-1; EndDo; aTab.FindAndGoto(aCol1,,"Col1"); If j<>aTab.CurLine Then Message("Проблема при поиске значения (2)!","!"); EndIf; //Добавление случайного значения внутри цикла поиска aTab.AddLineSorted("Col1","Col1,Col2,Col3",Random(10000),Random(10000),Random(10000)); EndDo; ProfilerStop(); debugbreak; Message("Done!"); //Для i5, конечные результаты для среднего времени исполнения каждой операции: //aTab.AddLineSorted() (нач. заполнение) -- 3.61 сек. //aTab.AddLine() и aTab.Sort(); -- 3.45 сек. //aTab.FindAndGoto(aCol1,,"Col1",1); -- 36 мс./10000 //aTab.FindAndGoto(aCol1,,"Col1"); -- 35010 мс./10000 // //Как показывает эксперимент, для больших таблиц поиск в сортированной таблице имеет очень большое преимущество перед поиском без учета сортировки (1000 раз в нашем случае), // преимущество будет только расти при увеличении количества строк в таблице //Сортировка больших таблиц работает достаточно медленно, однако, использование функции AddLineSorted не имеет преимущества перед заполнением массива в случайном порядке, а затем его сортировкой. // AddLineSorted, однако, незаменим в случаях, когда необходимо добавлять строки в таблицу в цикле, в котором одновременно происходит сортированный поиск в этой же таблице.