Tab.RemoveLocated

From SunFlurry wiki
Revision as of 08:53, 7 February 2021 by Admin (talk | contribs) (1 revision imported)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
  RemoveLocated (Удаление строк)
Объект:Таблица
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:Неверное имя столбца, невозможно превратить в число, строку
Визуальность:Нет

Функция ищет строки, в которых каждый из указанных в первом аргументе функции столбцов, содержит значение, указанное в соответствующем последующем аргументе функции. Строки, подходящие под фильтр поиска, будут удалены из таблицы. Поиск начинается со строки таблицы, следующей за текущей (CurLine). Поиск может принимать во внимание факт того, что таблица сортирована по всем столбцам поиска по неубыванию, что может значительно ускорить операцию.

Синтаксис

Tab.RemoveLocated(<Наименования столбцов поиска через запятую (STRING)>,<Значение столбца 1>,<Значение столбца 2>...,<Таблица сортирована по столбцам поиска (INT)>):<Удален по крайней мере один элемент (INT)>

Аргументы

  • <Список наименований столбцов поиска через запятую (STRING)> - Строка содержит список наименований столбцов поиска через запятую. Регистр наименований не имеет значения. Каждый заданный столбец должен присутствовать в таблице.
  • <Значение столбца ?> - (необязательный аргумент) Произвольные значения, которые необходимо найти в таблице в указанных в первом аргументе столбцах поиска. Количество аргументов должно совпадать с количеством столбцов.
  • <Таблица сортирована по столбцам поиска (INT)> - (необязательный аргумент) Возможные значения 0 и 1. Если таблица была предварительно отсортирована по всем столбцам поиска по неубыванию (т.е. предварительно выполнена конструкция aTab.Sort(<Столбец1,Столбец2...>), либо для заполнения таблицы вызывалась функция aTab.AddLineSorted(<Столбец1,Столбец2...>,...)), будет происходить поиск с учетом сортировки (ускорение). Пример сравнения скорости работы функции для сортированных и не сортированных таблиц см. ниже. Важно: если таблица не была отсортирована по столбцам поиска, функция не будет работать корректно.

Возвращаемое значение

Возвращает 1, если по крайней мере одна строка была удалена, иначе возвращает 0.

Примеры

//Создается и заполняется таблица значений
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,33);
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,77);
aTab.AddLine("b1,b2,b3,b4",5,2,3,4);

//Удаление будем производить, начиная со строки 3.
aTab.CurLine:=2;
aTab.RemoveLocated("b3",3);

aTab.Select();
While aTab.Next() Do
  Message(""+aTab.b1+"; "+aTab.b2+"; "+aTab.b3+"; "+aTab.b4);
EndDo;

//Будет выведено последовательно:
//"1; 2; 3; 4"
//"2; 2; 3; 33"
//"3; 5; 5; 4"


Сравнение скорости работы функций с сортировкой и функций без сортировки

Данный пример сравнивает скорость работы функции LocateAndGoto для сортированной и не сортированной таблиц. Внутри цикла поиска также происходит увеличение массива с помощью функции AddLineSorted для проверки корректности ее работы.
См. также Пример поиска в сортированных таблицах.

  Function TestTable(aTab)
    for i:=1 to 25000 Do
      j:=Random(10000)+1;
      aTab.CurLine:=j;
      while _And(j>1,aTab.Get(j-1,"b1")=aTab.b1,aTab.Get(j-1,"b2")=aTab.b2,aTab.Get(j-1,"b3")=aTab.b3,aTab.Get(j-1,"b4")=aTab.b4,aTab.Get(j-1,"b5")=aTab.b5) Do
        j:=j-1;
      EndDo;
      j2:=aTab.Locate("b1,b2,b3,b4,b5",aTab.b1,aTab.b2,aTab.b3,aTab.b4,aTab.b5);
      if j<>j2 then 
        Message("Проблема, невозможно найти индекс "+j+" (простой поиск)","!");
        Exit 0,2;
      EndIf;
      j2:=aTab.Locate("b1,b2,b3,b4,b5",aTab.b1,aTab.b2,aTab.b3,aTab.b4,aTab.b5,1);
      if j<>j2 then 
        Message("Проблема, невозможно найти индекс "+j+" (поиск с сортировкой)","!");
        Exit 0,2;
      EndIf;
    EndDo;
  EndFunction  

Randomize(1);
aTab:=Tab.Create("b1,b2,b3,b4,b5");
bTab:=Tab.Create("b1,b2,b3,b4,b5");
For i:=1 To 100000 Do
  bTab.Addline("b1,b2,b3,b4,b5",random(10),random(10),random(10),random(10),random(10));
  aTab.Addline("b1,b2,b3,b4,b5",random(1000),random(1000),random(1000),random(1000),random(1000));
EndDo;


ProfilerClear();
ProfilerStart();

aTab.Sort("b1,b2,b3,b4,b5");
bTab.Sort("b1,b2,b3,b4,b5");


TestTable(aTab);
TestTable(bTab);
ProfilerStop();
debugbreak;

Message("Done!");
//Для i5, конечные результаты для среднего времени исполнения каждой операции:
//aTab.Locate("b1,b2,b3,b4,b5",...)        -- 16.45 сек./50000
//aTab.Locate("b1,b2,b3,b4,b5",...,1)      -- 708 мс./50000
//aTab.Sort();                             -- 3.90 с.
//bTab.Sort();                             -- 3.92 с.
//TestTable(aTab);                         -- 5.0 с.
//TestTable(bTab);                         -- 13.4 с.
//
//Как показывает эксперимент, для больших таблиц поиск в сортированной таблице имеет большое преимущество перед поиском без учета сортировки 
//  (23 раза в нашем случае для суммы обеих таблиц), преимущество будет только расти при увеличении количества строк в таблице.
//Сортировка больших таблиц работает достаточно медленно, однако, она не зависит от типа данных в таблице.
//Для таблиц с большим количеством одинаковых данных (bTab) поиск происходит гораздо медленнее, чем для таблиц, где данные сильно отличаются. Дело в том, что Locate при проверке строки 
//  начинает проверку с первого столбца, если он совпадает с искомым значением, переходит ко второму и т.д. Если в таблице много одинаковых значений для многих строк необходимо большее 
//  число сравнений, чем, для таблиц, где одинаковых значений гораздо меньше. Поэтому, при таком поиске первыми выгодно указывать столбцы, которые содержат наиболее разнообразную информацию
//Это касается как сортированного, так и не сортированного поиска, однако, сортированный поиск менее подвержен влиянию распределения данных в таблице поиска.