Обсуждение:Класс для RSL, реализующий ассоциативные массивы с предопределёнными типами ключей и значений.
0 (0)
Обсуждение:Класс для RSL, реализующий ассоциативные массивы с предопределёнными типами ключей и значений. ( Обсуждение примера 12.01.2016 13:45 )
5(1)Класс для RSL, реализующий ассоциативные массивы с предопределёнными типами ключей и значений.
Класс
Тип ключа
Тип значения
TAssArraySI
String
Integer
TAssArraySS
String
String
TAssArraySD
String
Money
TAssArraySO
String
Object
TAssArrayIS
Integer
String
TAssArrayS
String
—
TassArrayI
Integer
—
TBoostBiMapSI
String
Integer
TBoostBiMapSS
String
String
Для класса TAssArraySD в большинстве случаев поддерживается автоматическая конвертация входных параметров значений в тип Money.
Класс TAssArraySO экспериментальный, может приводить к утечкам памяти и прочим подаркам.
Поскольку RSL case insensitive название DLM и объектов следует читать как T[ema]‑Assa‑R‑ray :)
Новое семейство классов TBoostBiMap это ассоциативные массивы с обратной связью, ключи в этом наборе уникальны, значения — нет. Для этих классов есть дополнительные методы с суффиксом R, реализующие поиск не по ключу, а по значению.
TAssArray ключ → значение
TBoostBiMap ключ ↔ значение
Методы и свойства
DelAll
Очищает массив. Удаляет все элементы.
Возвращаемое значение: нет
Insert(key, value)
Вставляет пару ключ-значение. Если ключ существует, то значение не заменяется.
Возвращаемое значение: нет
InsertM(key, value, key, value, key, value,..)
Вставляет пару ключ-значение. Если ключ существует, то значение не заменяется. Позволяет указать произвольное количество пар ключ-значение.
Возвращаемое значение: нет
Get(key)
Возвращаемое значение: value, соответствующее переданному ключу key. Если ключа в массиве нет, то возвращается значение с типом V_UNDEF. TArray, если как аргумент был передан TArray, в этом случае каждому элементу key массива-аргумента будет соответствовать элемент value массива-результата, или элемент типа V_UNDEF, если ключ не найден.
var obj=TAssArraySI("январь",1,"февраль",2);
obj.Insert("сентябрь",9);
obj.InsertM("октябрь",10,"ноябрь",11);
PrintLn(obj.Get("октябрь")); //выведет 10
GetR(value)
Для классов семейства TBoostBiMap.
Возвращаемое значение:
Массив TArray ключей key, соответствующий переданному значению value. Если ключа в массиве нет, то возвращается пустой массив.
Массив массивов (TArray с элементами TArray), если как аргумент был передан TArray, в этом случае каждому элементу value массива-аргумента будет соответствовать массив ключей key массива-результата.
obj.Insert("ООО Ромашка","7701123458");
obj.Insert("Ромашка, ООО","7701123458");
obj.Insert("Общество с огр. отв. Ромашка","7701123458");
var a=obj.GetR("7701123458");
PrintLn(a[0]); // Общество с огр. отв. Ромашка
PrintLn(a[1]); // ООО Ромашка
PrintLn(a[2]); // Ромашка, ООО
Exist(key)
Проверяет, существует ли ключ в массиве.
Возвращаемое значение: true — если ключ есть в массиве, false — если ключа нет.
ExistR(key)
Для TBoostBiMap проверяет, существует ли значение в массиве.
Возвращаемое значение: true — если значение есть в массиве, false — если значения нет.
Del(key)
Удаляет из массива пару ключ-значение по переданному ключу.
Возвращаемое значение: true — если ключ был в массиве, false — если ключа не было.
At(key)
Свойство, допускающее присваивание. Позволяет прочитать или записать значение по переданному ключу. В режиме чтения аналогично Get.
Возвращаемое значение: value, соответствующее переданному ключу key. Если ключа в массиве нет, то возвращается значение с типом V_UNDEF.
obj.At("декабрь")=12;
PrintLn(obj.At("декабрь"));
Inc(key)
Увеличивает на единицу значение, соответствующее переданному ключу key. Если ключа в массиве не было, то он добавляется со значением 1. Рекомендуется для использования в счётчиках.
Возвращаемое значение: нет
Rewind
Смещает внутренний указатель на позицию перед началом. Применяется для организации цикла по всем элементам массива.
Возвращаемое значение: нет
Next
Смещает внутренний указатель на следующую позицию. Может применяется для организации цикла по всем элементам массива.
Возвращаемое значение: true — если конец массива не достигнут, false — если достигнут конец массива.
Prev
Смещает внутренний указатель на предыдущую позицию. Может применяется для организации цикла по всем элементам массива.
Возвращаемое значение: true — если конец массива не достигнут, false — если достигнут конец массива.
CurrentKey
Возвращает ключ, соответствующий позиции внутреннего указателя. Применяется для организации цикла по всем элементам массива.
Возвращаемое значение: key или значение с типом V_UNDEF, если достигнут конец массива.
CurrentValue
Возвращает значение, соответствующее позиции внутреннего указателя. Применяется для организации цикла по всем элементам массива.
Возвращаемое значение: value или значение с типом V_UNDEF, если достигнут конец массива.
GetGE([key])
Смещает внутренний указатель на позицию, ключ которой больше или равен key. Если аргумент опущен, то берётся key установленный предыдущим вызовом SetSeekKey.
Возвращаемое значение: true — если внутренний указатель успешно установлен в границах массива, false — если достигнут конец массива.
stat=obj.GetGE("Москва");
while (stat)
PrintLn(obj.CurrentKey,": ", obj.CurrentValue);
stat=obj.next
end;
GetGT([key])
Смещает внутренний указатель на позицию, ключ которой строго больше key. Если аргумент опущен, то берётся key установленный предыдущим вызовом SetSeekKey.
Возвращаемое значение: true — если внутренний указатель успешно установлен в границах массива, false — если достигнут конец массива.
GetLT([key])
Смещает внутренний указатель на позицию, ключ которой строго меньше key. Если аргумент опущен, то берётся key установленный предыдущим вызовом SetSeekKey.
Возвращаемое значение: true — если внутренний указатель успешно установлен в границах массива, false — если достигнут конец массива.
GetLE([key])
Смещает внутренний указатель на позицию, ключ которой меньше либо равен key. Если аргумент опущен, то берётся key установленный предыдущим вызовом SetSeekKey.
Возвращаемое значение: true — если внутренний указатель успешно установлен в границах массива, false — если достигнут конец массива.
GetEQ([key])
Смещает внутренний указатель на позицию, ключ которой равен key. Если аргумент опущен, то берётся key установленный предыдущим вызовом SetSeekKey.
Возвращаемое значение: true — если внутренний указатель успешно установлен в границах массива, false — если достигнут конец массива.
SetSeekKey(key)
Устанавливает ключ key, который будет использоваться GetGE, GetGT без аргумента.
Возвращаемое значение: нет
obj.SetSeekKey("Москва");
stat=obj.GetGE();
while (stat)
PrintLn(obj.CurrentKey,": ", obj.CurrentValue);
stat=obj.next
end;
KeyNum
Переключает режим поиска по ключу или по значению для функций GetGE, GetGT, GetLE, GetLT, GetEQ и SetSeekKey. 0 — искать по ключу, 1 — искать по значению.
Возвращаемое значение: нет.
/* пример. печать городов с количеством филиалов меньше 10 */
import "boostbmp.d32";
var obj=TBoostBiMapSI();
obj.InsertM("Москва", 20, "Ленинград", 10, "Екатеринбург", 5, "Нижний Новгород", 3, "Казань", 1);
obj.KeyNum=1; //следующие функции поиска будут работать по значению
obj.SetSeekKey(10);
var r=obj.GetLT();
while (r);
PrintLn(obj.CurrentKey," ",obj.CurrentValue);
r=obj.prev();
end;
Выведет:
Екатеринбург 5
Нижний Новгород 3
Казань 1
Delete
Удаляет из массива пару ключ-значение по ключу, ранее установленному SetSeekKey.
Возвращаемое значение: true — если ключ был в массиве, false — если ключа не было.
Implode([delim])
Собирает строку из значений.
delim — разделитель, строка, не обязательный аргумент, по умолчанию «, »
Возвращаемое значение: строка содержащая все значения в строковом представлении, разделённые разделителем.
ImplodeKV([delimV][, delimKV])
Собирает строку из ключей и значений.
delimV — разделитель пар ключ-значение, строка, не обязательный аргумент, по умолчанию «, »
delimKV — разделитель внутри пары ключ-значение, строка, не обязательный аргумент, по умолчанию «->»
Возвращаемое значение: строка содержащая все пары ключ-значение, разделённые разделителями.
Explode(str, [delimV][, delimKV])
Разбирает строку на пары ключ-значение и добавляет их в массив.
delimV — разделитель пар ключ-значение, строка, не обязательный аргумент, по умолчанию «;»
delimKV — разделитель внутри пары ключ-значение, строка, не обязательный аргумент, по умолчанию «,»
Возвращаемое значение: нет.
Set(key, value)
Устанавливает элемент массива с ключом key в значение value. Если ключа не было, он добавляется, если был, то его значение заменяется новым.
Возвращаемое значение: нет
Sum
Возвращаемое значение: сумма всех значений массива, для пустого — 0.
Size
Возвращаемое значение: количество элементов в массиве.
Empty
Проверка массива на пустоту. По классике этот метод предпочтительнее сравнения .Size==0.
Возвращаемое значение: true — если массив пустой, false — если есть элементы.
GetKeyArray
Возвращаемое значение: объект класса TArray, содержащий все ключи массива.
GetValueArray
Возвращаемое значение: объект класса TArray, содержащий все значения массива.
GetArray([array_key][, array_value])
array_key — если параметр задан и имеет класс TArray, то в нём буде возвращён массив, содержащий все ключи ассоциативного массива.
array_value — если параметр задан и имеет класс TArray, то в нём буде возвращён массив, содержащий все значения ассоциативного массива.
В теории работает быстрее, чем последовательный вызов GetKeyArray и GetValueArray, поскольку перебирает ассоциативный массив один раз.
Возвращаемое значение: нет.
Add(key, value)
Арифметически прибавляет value к значению, соответствующему ключу key. Если в масиве не было ключа key, то он добавляется и значение устанавливается в value.
key — ключ изменяемого значения.
value — прибавляемая величина или значение нового элемента.
Возвращаемое значение: нет.
Min([key])
Возвращает минимальное значение в массиве. Прямой перебор, на больших массивах может работать медленно.
key — если параметр задан, то в нём будет возвращён ключ, соответствующий возвращённому значению.
Возвращаемое значение: минимальное значение в массиве
Max([key])
Возвращает максимальное значение в массиве. Прямой перебор, на больших массивах может работать медленно.
key — если параметр задан, то в нём будет возвращён ключ, соответствующий возвращённому значению.
Возвращаемое значение: максимальное значение в массиве
First([key])
Возвращает первое значение в массиве.
key — если параметр задан, то в нём будет возвращён ключ, соответствующий возвращённому значению. Это будет минимальный ключ.
Возвращаемое значение: первое значение в массиве
Last([key])
Возвращает последнее значение в массиве.
key — если параметр задан, то в нём будет возвращён ключ, соответствующий возвращённому значению. Это будет максимальный ключ.
Возвращаемое значение: последнее значение в массиве
FldNumber
Эмулирует количество полей.
Возвращаемое значение: для TassArrayS — 1, для остальных — 2
NRecords
Аналог Size.
GetByNum(idx[, key])
Возвращает значение по порядковому номеру. Функция обладает низким быстродействием и служит исключительно для целей отладки.
idx — порядковый номер.
key — если параметр задан, то в нём будет возвращён ключ, соответствующий возвращённому значению.
Возвращаемое значение: последнее значение в массиве
ForEachMacro(macro_name)
Перебирает все элементы массива, и для каждого вызывает процедуру с именем macro_name. Процедуре передаётся два аргумента: ключ и значение. Перебор происходит в порядке возрастания ключа.
Возвращаемое значение: нет
var obj=TAssArraySI(
"010", 1,
"030", 3,
"050", 5);
macro Proc1(p1, p2)
PrintLn("Hello! I'm Proc1. My args: ", p1, ", ", p2);
end;
obj.ForEachMacro("Proc1");
ForEachDescMacro(macro_name)
Для TBoostBiMap. Перебирает все элементы массива, и для каждого вызывает процедуру с именем macro_name. Процедуре передаётся два аргумента: ключ и значение. Перебор происходит в порядке убывания ключа.
Возвращаемое значение: нет
ForEachMacroR(macro_name)
Для TBoostBiMap. Перебирает все элементы массива, и для каждого вызывает процедуру с именем macro_name. Процедуре передаётся два аргумента: ключ и значение. Перебор происходит в порядке возрастания значения.
Возвращаемое значение: нет
ForEachDescMacroR(macro_name)
Для TBoostBiMap. Перебирает все элементы массива, и для каждого вызывает процедуру с именем macro_name. Процедуре передаётся два аргумента: ключ и значение. Перебор происходит в порядке убывания значения.
Возвращаемое значение: нет
Write(file_name)
Записывает массив в файл. Впоследствии массив может быть прочитан методом Read.
file_name — строка, имя файла в который будет записан массив.
Возвращаемое значение: нет
Read(file_name)
Читает из файла массив, ранее записанный методом Write. Если файл не найден, будет сгенерированна ошибка.
file_name — строка, имя файла из которого будет прочитан массив.
Возвращаемое значение: нет
Copy()
Копирует объект в новый.
Возвращаемое значение: объект того же класса, содержащий копию
Конструктор
По поведению аналогичен InsertM.
Посмотреть пример
>> Ответитьудобно - не нужно временные таблицы делать ( nagatsuev 18.01.2016 23:40 )
5(1)использую sets.mac - там уже давно ассоциативный массив есть вполне сностный
тож кстате вылетает и не умеет делать h.Add(account+string(dt),1); - т.е. больше 25 символов в ключе.
приходится придумывать id шники.
>> Ответитьс момента первой публикации было несколько новых сборок ( tema 19.01.2016 12:18 )
5(1)Not specified
>> Ответитьхотел скорость померять и чтото туплю, почему undef? ( deusex 21.01.2016 14:19 )
5(1)cl.Client это ключ cl.Code значение, если убрать string то падает по жосткому.
file cl(client); var cl_arr=TArray; var obj=TAssArraySI(),i,val,tm,res; while (next(cl)) obj.Insert ( string(cl.Client) , string( cl.Code) ); cl_arr[cl_arr.size]=cl.Client; end; obj.Rewind(); //println(int(time())); i=0; while (i<1000) val=random(1000); tm=Int(time()); res=obj.Get( string(cl_arr[val]) ); println(Int(time())-tm," ",val," ",res); i=i+1; end;
>> ОтветитьПонял сам не SI а SS ( deusex 21.01.2016 14:33 )
5(1)Not specified
>> ОтветитьИ как время? У меня получилась одна единичка и все остальные нули. ( tema 21.01.2016 15:03 )
5(1)Not specified
>> ОтветитьПоменял код теста. ( deusex 21.01.2016 15:32 )
5(1)На SSD разница меньше 8 процентов, на обычном серваке 25% в принципе жинеспособно.
import "..\\obj\\assarray.d32"; file cl(client); var cl_arr=TArray; println(NRecords(cl)); var obj=TAssArraySS(),i,val,tm,res; while (next(cl)) obj.Insert ( string(cl.Client) , string( cl.Code) ); cl_arr[cl_arr.size]=cl.Client; end; println(cl_arr.size); tm=(int(time())); i=0; while (i<1000000) val=abs(random(100000)); res=obj.Get( string(cl_arr[val]) ); i=i+1; end; println(int(time())-tm); tm=(int(time())); i=0; while (i<1000000) val=abs(random(100000)); cl.Client=cl_arr[val]; GetEq(cl); i=i+1; end; println(int(time())-tm);
>> ОтветитьСпасибо, интересно получилось. Надо написать IS, может ещё чуть-чуть отыграется. ( tema 21.01.2016 15:44 )
5(1)Not specified
>> ОтветитьЗапилил TAssArrayIS(), прогнал вашим макросом ( tema 22.01.2016 11:22 )
5(1)
А как думаете лишон ли ваш класс проблемы rsl которую я нашел в теме. ( deusex 21.01.2016 16:08 )
5(1)https://isupport.softlab.ru/Portal/InterSupport/BugList/scr.asp?id=P2N154593
Надо будет тест модифицировать под ваш класс для проверки.
>> ОтветитьБудет ли тормозить, если создать великие тыщи экземпляров TAssArraySS? ( tema 21.01.2016 16:43 )
5(1)Если тормозит сам механизм классов RS, то будет.
or_class я не пользую, это длинная тема :)
Хотя, что тут думать, трясти надо! Т.е. тестировать.
>> ОтветитьЭто имелось ввиду? Быстро работает ( tema 21.01.2016 17:01 )
5(1)import assarray; const N=1000000; var a=TArray(N); var i, t_save; class TEmptyClass() end; t_save=Time(); for (i, 0, N-1) a[i]=0; end; var t_0=Time()-t_save; a.Size=0; t_save=Time(); for (i, 0, N-1) a[i]=GenObject("TEmptyClass"); end; var t_class=Time()-t_save; a.Size=0; t_save=Time(); for (i, 0, N-1) a[i]=GenObject("TAssArraySS"); end; var t_assa=Time()-t_save; a.Size=0; [Integer #######](Int(t_0)); [TEmptyClass #######](Int(t_class)); [TAssArraySS #######](Int(t_assa));
Integer 43 TEmptyClass 229 TAssArraySS 261
>> Ответитьто было в локале на rsrti ( tema 21.01.2016 17:08 )
5(1)
Не добавляется ничего, поэтому и не находит. Замените на TAssArraySS ( tema 21.01.2016 14:53 )
5(1)TAssArraySI
S - значит ключ строковый
I - значит значение целое
Insert тихо сливается если аргумент не совпал.
Исходники дома, не могу точно сказать, почему, или сообщение или ошибку должен был выкинуть.
>> Ответить
Обновляю. В сборки вошли классы TBoostBiMap ( tema 03.02.2016 09:34 )
5(1)Они позволяют производить индексированный поиск не только по ключу но и по значению. Подробности в help.odt
>> ОтветитьОбновляете в том же примере? ( Волшебник 03.02.2016 11:30 )
5(1)Просто там дата стоит 11-е число.
>> ОтветитьДа. Не пложу сущностей :) ( tema 03.02.2016 11:39 )
5(1)Not specified
>> Ответить
для классов семейства TBoostBiMap добавлены методы Write и Read ( tema 25.09.2016 16:57 )
5(1)обёртка к Serialize
Если набор значений большой и более-менее постоянный, то его не удобно и не эффективно инициализировать его каждый раз в коде. то можно один раз записать, а затем читать из файла.
>> ОтветитьВерсия 0.1.6 Метод Copy для семейства классов TAssArray ( tema 21.03.2017 23:35 )
5(1)Not specified
>> ОтветитьОбновил сборку ( tema 08.11.2018 22:57 )
5(1)Из нового:
Список с суфиксом L — ключи unsigned int64. Можно использовать для паспорта номер+серия. Протестировано на списки недействительных паспортов с мвд.рф. Если раньше при использовании строки такой список вызывал переполнение памяти, то теперь влезает в память 32-х разрядного приложения.
Сериализация доступна не только для объектов на основе библиотеки boost, но и для одля объектов на основе std. Теперь любой ассоциативный массив можно записать в файл и прочитать из файла.
>> Ответить