JoinStringValues

From SunFlurry wiki
Jump to: navigation, search
  JoinStringValues (Функции работы со строками)
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:Невозможно превратить в строку
Визуальность:Нет

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

Строки-массивы используются для хранения большого количества одинаковых по натуре строк, для которых не имеет большого смысла использовать более дорогие методы хранения, типа списков или таблиц. Функции, работающие с такими кодированными массивами, в достаточной мере оптимизированы и практически не уступают по скорости сортированным таблицам или спискам, при этом занимая меньше памяти и гораздо проще с точки зрения программирования. Некоторые возможности функций для работы с такими строками (к примеру AssertStringValues, JoinStringValues) не имеют прямых аналогов в таблицах, что делает их более удобными источниками данных, когда есть необходимость в таких специфических действиях. Иными словами: данный набор функций может выиграть в просторе программирования и уменьшении потребности в памяти, тогда как работа с таблицами обычно выигрывает в скорости. Каждая строка-массив имеет формат:

  • Для строк с префиксами: <Префикс 1><Отделитель префикса><Значение 1><Разделитель значений><Префикс 2><Отделитель префикса><Значение 2><Разделитель значений>.... Пример: "1@Иванов#2@Петров#5@Сидоров" использует отделитель префикса "@" и разделитель значений "#".
  • Для строк без префиксов: <Значение 1><Разделитель значений><Значение 2><Разделитель значений>.... Пример: "Иванов"+_NEWLINE+"Петров"+_NEWLINE+"Сидоров" использует разделитель значений _NEWLINE.

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

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

Нужно также понимать, что, если префиксы элементов используются для адресации из какого-то другого источника (т.е., данные не хранятся в строках, а, к примеру, в элементах справочников), то не имеет особого смысла применение этих функций, так как перенос между источниками будет усложнять программу, и не будет давать выигрыша в скорости и простоте кода по сравнению с работой с таблицами или списками.

Пример сравнения скорости выполнения и сложности построения между функциями JoinStringValues (команда "AND") и таблицами см. в статье Пример сравнения функций строк-массивов и таблиц

Синтаксис

JoinStringValues(<Аргумент 1>,<Аргумент 2>,<Строка-разделитель>,<Тип операции (STRING)>="OR",<Разделитель префикса>=""):<Результат (STRING)>

Аргументы

  • <Аргумент 1> - Первая строка-массив.
  • <Аргумент 2> - Вторая строка-массив.
  • <Строка-разделитель> - Строка-разделитель элементов массива. Оба массива должны иметь одинаковый разделитель.
  • <Тип операции (STRING)> - Тип операции объединения. Возможны следующие значения:
    • AND: Конъюнкция двух массивов. Результат будет содержать массив, элементы которого входили одновременно в первый массив и во второй массив. Операция сохраняет префиксы первого массива, префиксы второго массива не используются.
    • OR, ADD: Дизъюнкция двух массивов (по умолчанию) (логическое сложение). Результат будет содержать массив, элементы которого входили либо в один, либо во второй массив. В результат не добавляются дубли. Операция сохраняет префиксы первого массива, префиксы второго массива используются только для элементов второго массива, добавленных в первый массив.
    • XOR: Неэквивалентность двух массивов. Результат будет содержать массив, элементы которого входили либо в один, либо во второй массив, но не одновременно в оба массива. Операция сохраняет префиксы первого массива и второго массивов.
    • SUB: Логическое вычитание двух массивов. Соответствует операции <Аргумент 1> XOR (<Аргумент 1> AND <Аргумент 2>). Результат будет содержать массив, элементы которого входили в первый массив, но не входили во второй массив. Операция сохраняет префиксы первого массива, префиксы второго массива не используются.
  • <Разделитель префикса (STRING)> - (необязательный аргумент) Строка разделитель префиксов значений. По умолчанию отсутствует (т.е., префиксы не используются).

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

Функция возвращает строку в формате ANSI, если оба массива аргумента были в формате ANSI, иначе будет возвращена строка в формате UTF-16.

Примеры

//Массивы имен будут разделены знаками "#" и иметь цифровые префиксы, отделенные знаками "@"
аСтр:="1@Bella#2@Jennifer#3@Paul#4@Philip#5@George#6@Max#7@Michael#8@Gregory#9@Danny";
аСтр2:="1@George#2@Michael#3@Paul#4@Philip#5@Justin#6@Lynn#7@Peter";

Message(JoinStringValues(аСтр,аСтр2,"#","AND","@"));
//Будет выведено: "5@George#7@Michael#3@Paul#4@Philip". Заметьте: используются префиксы первого массива.

Message(JoinStringValues(аСтр,аСтр2,"#","OR","@"));
//Будет выведено: "1@Bella#2@Jennifer#3@Paul#4@Philip#5@George#6@Max#7@Michael#8@Gregory#9@Danny#5@Justin#6@Lynn#7@Peter"

Message(JoinStringValues(аСтр,аСтр2,"#","XOR","@"));
//Будет выведено: "5@Justin#6@Lynn#7@Peter#1@Bella#9@Danny#8@Gregory#2@Jennifer#6@Max"

Message(JoinStringValues(аСтр,аСтр2,"#","SUB","@"));
//Будет выведено: "1@Bella#9@Danny#8@Gregory#2@Jennifer#6@Max"