Difference between revisions of "Tab.FindAndGet"

From SunFlurry wiki
Jump to: navigation, search
(Аргументы)
 
m (1 revision imported)
 
(No difference)

Latest revision as of 08:53, 7 February 2021

  FindAndGet (Поиск в ячейках)
Объект:Таблица
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:Неверный индекс строки, столбца, невозможно превратить в число, строку
Визуальность:Нет

Функция производит поиск значения в таблице, с возможным указанием начального индекса поиска, возможным указанием столбца поиска. Поиск может принимать во внимание факт того, что таблица сортирована по указанному столбцу по неубыванию, что может значительно ускорить нахождение значения. Если значение найдено, индекс строки или/и столбца, где оно было найдено, возвращается в переменных третьего и четвертого аргументов. Функция возвращает значение в столбце, заданном первым аргументом, из строки, в которой было найдено значение поиска, либо возвращает пустое значение, если поиск не был завершен успешно. Текущая строка при этом не изменяется. Поиск может осуществляться как по строкам в определенном столбце, так и по столбцам в указанной строке. Функция также может осуществлять поиск по всей таблице. Функция работает как последовательный вызов функций Find и Get с доп. условием.

Синтаксис

Tab.FindAndGet(<Наименование или индекс столбца значения результата (STRING,INT)>,<Значение поиска>,<Начальный индекс поиска, результирующий индекс (INT)>,<Наименование или индекс столбца поиска, индекс результирующего столбца (STRING,INT)>,<Таблица сортирована по столбцу поиска (INT)>):<Полученное значение или пустое значение>

Аргументы

  • <Наименование или индекс столбца значения результата (STRING,INT)> - Строковое значение аргумента задает наименование столбца, значение ячейки которого необходимо получить, числовое значение задает номер этого столбца (нумерация столбца происходит с единицы).
  • <Значение поиска> - Произвольное значение, которое необходимо найти в таблице. Если значение представляет собой список, для каждого проверяемого значения, будет производиться поиск в списке. Если искомое значение является объектом базы данных, поиск будет осуществляться с учетом возможного вхождения в папки (т.е., будет выполнена операция, аналогичная Contains. Сортировка таблицы не будет приниматься во внимание, для поисков внутри списка.
  • <Начальный индекс поиска, результирующий индекс (INT)> - (необязательный аргумент)(возможен аргумент-переменная (ByRef)) Числовой аргумент, задающий начальный индекс строки поиска. Если аргумент является переменной, и значение было найдено, переменная будет обновлена индексом найденной строки.
  • <Наименование или индекс столбца поиска, индекс результирующего столбца (STRING,INT)> - (необязательный аргумент)(возможен аргумент-переменная (ByRef)) Строковое значение аргумента задает наименование столбца, значение ячейки которого необходимо найти, числовое значение задает номер этого столбца (нумерация столбца происходит с единицы). Если аргумент является переменной, которая содержала ноль при вызове функции, и значение было найдено, переменная будет обновлена индексом найденного столбца.
  • <Таблица сортирована по столбцу поиска (INT)> - (необязательный аргумент) Возможные значения 0 и 1. Если таблица была предварительно отсортирована столбцу поиска по неубыванию, будет происходить поиск с учетом сортировки (ускорение). Пример сравнения скорости работы функции для сортированных и не сортированных массивов см. ниже. Сортированный поиск будет работать только в случае, когда столбец поиска указан, если поиск производится по всей таблице или по одной строке, значение параметра будет игнорировано. Важно: если таблица не была отсортирована по столбцу поиска, сортированный поиск не будет работать корректно.

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

Возвращается значение столбца, адресованного первым аргументом из строки, где было найдено исходное значение, если исходное значение не было найдено, функция возвращает пустое значение.

Примеры

//Создается и заполняется таблица значений
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);

Message("Значение столбца b1 строки, в столбце b2 которой было найдено число 5: "+aTab.FindAndGet("b1",5,,"b2"));

iCol:=0;
Message("Значение столбца b1 строки, где в одном из столбцов было найдено число 77: "+aTab.FindAndGet("b1",77,,iCol));

//Будет выведено последовательно:
//"Значение столбца b1 строки, в столбце b2 которой было найдено число 5: 3"
//"Значение столбца b1 строки, где в одном из столбцов было найдено число 77: 4"


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

Данный пример сравнивает скорость работы функции 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, однако, незаменим в случаях, когда необходимо добавлять строки в таблицу в цикле, в котором одновременно происходит сортированный поиск в этой же таблице.