Difference between revisions of "List.SetByName"

From SunFlurry wiki
Jump to: navigation, search
m (1 revision imported)
m (1 revision imported)
 
(One intermediate revision by one other user not shown)
Line 22: Line 22:
 
* <code>''<Строковое представление (STRING)>''</code> - Строковое представление изменяемого значения. Если в списке отсутствует значение с указанным представлением, оно будет добавлено. При наличии сортировки по строковым значениям, добавление происходит без нарушение сортировки.
 
* <code>''<Строковое представление (STRING)>''</code> - Строковое представление изменяемого значения. Если в списке отсутствует значение с указанным представлением, оно будет добавлено. При наличии сортировки по строковым значениям, добавление происходит без нарушение сортировки.
 
* <code>''<Значение>''</code> - Значение, на которое будет происходить изменение
 
* <code>''<Значение>''</code> - Значение, на которое будет происходить изменение
* <code>''<Сортировка (INT)>''{{Default|{{eq}}0}}</code> - {{optional}} Возможные значения -- 1 или 0. Если список отсортирован по строковым представлениям по неубыванию, функция производит поиск по сортированным значениям (ускорение). Если в списке отсутствует значение с указанным представлением, добавление происходит без нарушение сортировки. Сортировка по наименованию больших списков при использовании индексирования по именам рекомендуется, так как такой подход может сильно ускорить работу с такими списками (см. ниже для примера).
+
* <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 (по умолчанию) -- при поиске не будет учитываться регистр (замедление). '''Внимание:''' в больших массивах функция без учета регистра (программа приводит строковые представления к верхнему регистру при каждом сравнении) значение параметра по умолчанию будет значительно замедлять выполнение функции.
  

Latest revision as of 19:07, 20 November 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 раз в нашем случае).