Страницы: 1
RSS
Пользовательский аналог Dictionary
 
Решил поиграться с созданием класса... Вот, что из этого получилось.

А получился эквивалент объекта Dictionary заточенный под работу с массивами.
Свойства/методы:
    - Count - только чтение - количество записей в классе
    - Keys - только чтение - получение всех ключей объекта в виде одномерного массива
    - Items - только чтение - получение одномерного массива с итемами.
    - Exists - только чтение - Проверка на наличие ключа в классе (.Exists (Key))
    - KeyID - только чтение - извлечение ключа по индексу (.KeyID (KeyID))
    - ItemID - чтение/запись - добыча значения по индексу (.ItemID (KeyID)) либо перезапись значения (.ItemID (KeyID)= Value)
    - Item - чтение/запись - добыча значения по ключу (.Item (Key)) либо перезапись значения (.Item (Key)= Value)
    - ItemsByKeys - только чтение - извление списка значений в виде одномерного массива по списку ключей, если ключ не найден то в списке будет Empty  (.ItemsByKeys (KeysList()))
    - Clear - метод - Полная очистка объекта
    - AddFromArrayID - метод - массовая загрузка ключей из одно/двумерного массива в объект. В случае с двумерным массивом нужно указать столбец, из которого будут извлекаться ключи. (.AddFromArrayID (SourceArray(), Column, sortedArr, notEmpty, addArr)):
      -- входной массив . Как писал выше одно/двумерный.
      -- в случае двумерного массива номер "столбца" этого массива для добычи ключей
      -- опционально - по дефолту стоит False - сортирован ли массив
      -- опционально - по умолчанию True - игнорировать значения с длиной в текстовом эквиваленте 0
      -- опционально - по умолчанию True - добавить к существующим записям (если таковые имеются) или заменить старые на новые
    Извлекаются ключи из массива, если нужно сортируются, отбираются уникальные значения, в качестве значения к каждому ключу в массиве итемов прилагается массив с индексами, где было найден такой ключ в исходном массиве. Исходный массив не изменяется.
    - Sort - метод - сортировка внешнего для класса двумерного массива по определенному "столбцу"

    Важно - если загнать в объект не сортированный массив, т.е. умышленно поставив True в соответствующем параметре загрузки, то будет ОЙ - более половины функционала потеряется. Поиск ключей точно работать не будет.
Если сравнивать с Dictionary плюсы и минусы:
- Плюсы:
    -- единовременная загрузка данных без цикла со стороны пользователя
    -- полная индексация исходного массива по добытым ключам
    -- как и в Dictionary есть единовременная выгрузка ключей/итемов в массив
    -- выборочное извлечение значений по списку ключей
    -- отсортированный по возрастанию список ключей
    -- сравнительное увеличение скорости загрузки массивов более 120к ключей. До этого кол-ва строк/ключей Dictionary опережает по скорости

- Минусы:
    -- жесткая привязка к отсорованности списка ключей
    -- медленная скорость на малых объемах (по сравнению со словарём)
    -- необходимость вставлять модуль класса в каждый проект, где этот объект может быть задействован
------------------------------------------- Updated 22.03.19 ---------------------------------------------
Добавлены методы:
    - Add Key, Value - добавление пары ключ/значение в объект
    - AddKey Key - Добавление ключа с пустым итемом
    - AddKeysFromArray Arr(), n,  s - Добавление ключей списком , список ключей в виде одномерного/двумерного массива, в случае двумерного массива  номер "столбца", нужно ли сортировать список перед выборкой из него списка уникальных и внесения в объект
    - AddKeysFromList Arr(),  IsUnic - тоже самое, что и пункт выше - массив/список, все ли значения в списке уникальны
    - RemoveByKey Key - удаление пары ключ/значение по ключу
    - RemoveByKeysList KeysList() - удаление по списку ключей в виде одномерного массива
    - RemoveByID Idx - удаление пары ключ/значение по номеру индекса
    Для внешних по отношению к объекту/классу массивов:
    - txtSort Arr(), nCol,  iComp - тестовый сортер с проверкой на пустые значения в опорном "столбце" массива. Все пустоты переносятся хвост отсортированного массива. Только по возрастанию. Двумерный массив, "столбец" массива, установка режима сравнения строк - 0 - Binary, 1 - Text
    - GetUnicFromIdxList IdxArr(), Arr(), Xpos, needSort - получение из двумерного массива по списку индексов (строк)и по опорному "столбцу" списка уникальных значений отсортированных по возрастанию. Список индексов, просматриваемый массив, "столбец" массива, нужно ли сортировать добытый список перед выборкой уникальных. В массив со списком индексов вернется список уникальных значений. Последняя опция не просто выбор сортировать/не сортировать - от нее зависит корректность добычи уникальных значений, поэтому если просматриваемый массив с порядком индексов просмотра не был предварительно отсортирован по возрастанию, то этот параметр нужно установить в True.
Тест по скорости наполнения + индексации:
Скрытый текст
Тестер:
Скрытый текст

П.С.: Замечания/советы/конструктивная критика приветствуется.
П.П.С.: Про очередной "велосипед" в курсе :)
Изменено: Anchoret - 22.03.2019 06:03:55
 
Убрал слияние массивов, т.к. в этом нет смысла при индексации. Ну и само по себе - это время ёмкое удовольствие (сортировка добавленного массива, индексация, отследить пересечение с ключами существующего массива, слияние, снова сортировка). Перепись содержимого итемов пока оставил...
Вот думаю что бы добавить еще в плане функционала... Есть мысли насчет всяких аналогов листовых функций + всяческие выгрузки в текстовые /csv файлы.
 
Спасибо, очень интересная вещь. Массовой загрузки и массового извлечения по списку как раз не хватает в стандартном Dictionary
F1 творит чудеса
 
Попозже (не в ближайшие дни) внесу разнообразие загрузок в объект) Пока в голове след.набор вариантов загрузки значений:
- единовременная загрузка ключей/значений из диапазона/списка "столбцов" двумерного массива в виде одномерных массивов
- похожий вариант , но в диапазона листа. тут уже расширяется список вариантов: значения, формулы, форматы. возможна загрузка в массив с не смежных диапазонов, но это будет в десятки раз дольше

Также можно прикрутить все, что душе угодно - от чтения/записи текстовых (как и писал ранее) или *csv файлов до отправки содержимого массива/диапазона по почте.
 
Расширил список методов класса.
Страницы: 1
Наверх