Difference between revisions of "List.SetByName"
m (1 revision imported) |
1>Admin |
||
Line 22: | Line 22: | ||
* <code>''<Строковое представление (STRING)>''</code> - Строковое представление изменяемого значения. Если в списке отсутствует значение с указанным представлением, оно будет добавлено. При наличии сортировки по строковым значениям, добавление происходит без нарушение сортировки. | * <code>''<Строковое представление (STRING)>''</code> - Строковое представление изменяемого значения. Если в списке отсутствует значение с указанным представлением, оно будет добавлено. При наличии сортировки по строковым значениям, добавление происходит без нарушение сортировки. | ||
* <code>''<Значение>''</code> - Значение, на которое будет происходить изменение | * <code>''<Значение>''</code> - Значение, на которое будет происходить изменение | ||
− | * <code>''<Сортировка (INT)>''{{Default|{{eq}}0}}</code> - {{optional}} | + | * <code>''<Сортировка (INT)>''{{Default|{{eq}}0}}</code> - {{optional}} Если список отсортирован по строковым представлениям по неубыванию, функция производит поиск по сортированным значениям (ускорение). Если в списке отсутствует значение с указанным представлением, добавление происходит без нарушение сортировки. Сортировка по наименованию больших списков при использовании индексирования по именам рекомендуется, так как такой подход может сильно ускорить работу с такими списками (см. ниже для примера). Возможные значения: |
+ | ** '''0''' -- Список не был отсортирован, сортировка не будет сохранена. | ||
+ | ** '''1''' -- Список был отсортирован, если в списке уже имеются значения с представлениями, равными изменяемому, будет изменено первое из найденных значений, сортировка будет сохранена. | ||
+ | ** '''2''' -- Список был отсортирован, если в списке уже имеются значения с представлениями, равными изменяемому, будет изменено произвольное из найденных значений, сортировка будет сохранена (данный режим немного быстрее режима 1). | ||
* <code>''<Без учета регистра (INT)>{{Default|{{eq}}0}}''</code> - {{optional}} Возможные значения: 0 -- при поиске будет учитываться регистр, 1 (по умолчанию) -- при поиске не будет учитываться регистр (замедление). '''Внимание:''' в больших массивах функция без учета регистра (программа приводит строковые представления к верхнему регистру при каждом сравнении) значение параметра по умолчанию будет значительно замедлять выполнение функции. | * <code>''<Без учета регистра (INT)>{{Default|{{eq}}0}}''</code> - {{optional}} Возможные значения: 0 -- при поиске будет учитываться регистр, 1 (по умолчанию) -- при поиске не будет учитываться регистр (замедление). '''Внимание:''' в больших массивах функция без учета регистра (программа приводит строковые представления к верхнему регистру при каждом сравнении) значение параметра по умолчанию будет значительно замедлять выполнение функции. | ||
Revision as of 15:02, 30 July 2021
SetByName (Изменение по строковому представлению) | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Функция заменяет в списке значение с указанным строковым представлением на указанное, либо добавляет значение, если представление отсутствует.
Синтаксис
List.SetByName(<Строковое представление (STRING)>,<Значение>,<Сортировка (INT)>=0,<Без учета регистра (INT)>=1)
Аргументы
<Строковое представление (STRING)>
- Строковое представление изменяемого значения. Если в списке отсутствует значение с указанным представлением, оно будет добавлено. При наличии сортировки по строковым значениям, добавление происходит без нарушение сортировки.<Значение>
- Значение, на которое будет происходить изменение<Сортировка (INT)>=0
- (необязательный аргумент) Если список отсортирован по строковым представлениям по неубыванию, функция производит поиск по сортированным значениям (ускорение). Если в списке отсутствует значение с указанным представлением, добавление происходит без нарушение сортировки. Сортировка по наименованию больших списков при использовании индексирования по именам рекомендуется, так как такой подход может сильно ускорить работу с такими списками (см. ниже для примера). Возможные значения:- 0 -- Список не был отсортирован, сортировка не будет сохранена.
- 1 -- Список был отсортирован, если в списке уже имеются значения с представлениями, равными изменяемому, будет изменено первое из найденных значений, сортировка будет сохранена.
- 2 -- Список был отсортирован, если в списке уже имеются значения с представлениями, равными изменяемому, будет изменено произвольное из найденных значений, сортировка будет сохранена (данный режим немного быстрее режима 1).
<Без учета регистра (INT)>=0
- (необязательный аргумент) Возможные значения: 0 -- при поиске будет учитываться регистр, 1 (по умолчанию) -- при поиске не будет учитываться регистр (замедление). Внимание: в больших массивах функция без учета регистра (программа приводит строковые представления к верхнему регистру при каждом сравнении) значение параметра по умолчанию будет значительно замедлять выполнение функции.
Примеры
a:=List.Create(); //Список пуст a.Add(123); //Список содержит значение 123 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 раз в нашем случае).