Difference between revisions of "List.GetByName"
(No difference)
|
Revision as of 15:33, 28 July 2019
| GetByName (Значение по строковому представлению) | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||
Функция возвращает значение списка с указанным строковым представлением, либо пустое значение, если представление отсутствует
Синтаксис
List.GetByName(<Строковое представление (STRING)>,<Сортировка (INT)>=0,<Без учета регистра (INT)>=1):<Значение>
Аргументы
<Строковое представление (STRING)>- Строковое представление, по которому необходимо получить значение. Поиск производится без учета регистра.<Сортировка (INT)>=0- (необязательный аргумент) Возможные значения -- 1 или 0. Если список отсортирован по строковым представлениям по неубыванию, функция производит поиск по сортированным значениям (ускорение).<Без учета регистра (INT)>=0- (необязательный аргумент) Возможные значения: 0 -- при поиске будет учитываться регистр, 1 (по умолчанию) -- при поиске не будет учитываться регистр (замедление). Внимание: в больших массивах функция без учета регистра (программа приводит строковые представления к верхнему регистру при каждом сравнении) значение параметра по умолчанию будет значительно замедлять выполнение функции.
Возвращаемое значение
Возвращает найденное значение или пустое значение, если строкое представление в списке отсутствует.
Примеры
a:=List.Create(); //Список пуст
a.SetByName("Второй",234); //Список содержит значение 234 со строковым представлением "Второй"
Message(a.GetByName("ВТОРОЙ")); //Выводит 234
Сравнение скорости работы функций с сортировкой и функций без сортировки
Данный пример сравнивает скорость работы функции FindByName, GetByName и SetByName для сортированного и не сортированного по наименованию списков. Внутри цикла поиска также происходит изменение и увеличение массива для проверки корректности работы функции SetByName. В примере использованы версии функций с учетом регистра, так как преобразование регистра при поиске замедляет работу функций и несколько нивелирует преимущество функций с сортировкой перед обычными функциями.
ProfilerClear();
ProfilerStart();
//Блок с несортированным массивом
randomize(1);
aList:=List.Create();
For i:=1 To 100000 Do
aList.SetByName(""+Random(10000),1,,0);
EndDo;
For i:=1 To 100000 Do
j:=Random(aList.Size())+1;
aNum:=aList.GetName(j);
j2:=aList.FindByName(aNum,,,0);
If j<>j2 Then
Message("Проблема при поиске значения!","!");
EndIf;
//Тестируем также функцию GetByName
aList.GetByName(aNum,,0);
//Изменение или увеличение массива 50 на 50
aList.SetByName(""+Random(20000),2,,0);
EndDo;
//Блок с сортированным массивом
randomize(1);
aList:=List.Create();
For i:=1 To 100000 Do
aList.SetByName(""+Random(10000),1,1,0);
EndDo;
For i:=1 To 100000 Do
j:=Random(aList.Size())+1;
aNum:=aList.GetName(j);
j2:=aList.FindByName(aNum,,1,0);
If j<>j2 Then
Message("Проблема при поиске значения (2)!","!");
EndIf;
//Тестируем также функцию GetByName
aList.GetByName(aNum,1,0);
//Изменение или увеличение массива 50 на 50, используется сортированное изменение
aList.SetByName(""+Random(20000),2,1,0);
EndDo;
ProfilerStop();
debugbreak;
writeln("Done!");
//Для i5, конечные результаты для среднего времени исполнения каждой операции:
//aList.SetByName(""+Random(10000),1,,0) -- 3186 мс./100000
//j2:=aList.FindByName(aNum,,,0) -- 4725 мс./100000
//aList.GetByName(aNum,,0) -- 4697 мс./100000
//aList.SetByName(""+Random(20000),2,,0) -- 5200 мс./100000
//
//aList.SetByName(""+Random(10000),1,1,0) -- 429 мс./100000
//j2:=aList.FindByName(aNum,,1,0) -- 312 мс./100000
//aList.GetByName(aNum,1,0) -- 263 мс./100000
//aList.SetByName(""+Random(20000),2,1,0) -- 568 мс./100000
//
//Как показывает эксперимент, для больших массивов поиск и изменение в сортированном массиве по именам имеет большое преимущество перед поиском без учета сортировки (примерно в 10 раз в нашем случае).