| | | | |
Реализация ассоциативных массивов в Delphi | Полный текст материала
Другие публикации автора: Дмитрий Рябов
Цитата или краткий комментарий: «... На практике часто возникает потребность сохранять и обрабатывать данные в массивах, осуществляя доступ к элементам не по индексу, а по ключу. Для этого используются ассоциативные массивы, которые есть, например, во многих скриптовых языках. ...» |
Важно:- Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
- Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
- При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
- Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.
Добавить свое мнение.
[Массивы]
Отслеживать это обсуждение
Всего сообщений: 2907-05-2014 13:18Стандартный принцип для автофинализируемых типов, к коим относятся и интерфейсы: пока жива хотя бы одна переменная, ссылающаяся на данный объект, объект будет жить. |
|
07-05-2014 10:40В функции Main написано
WriteLn('Arrays is free');
Как сделать так, чтобы они не удалялись? |
|
18-02-2013 11:17Вообще очень даже неплохо. Познакомился с ассоциативными массивами в PHP. Поднял вопрос о реализации их в Дельфи. Этот модуль позволяет построить более понятный и качествнный код, поскольку использование многомерных ассоциативных массовов для обработки данных может упростить задачу многократно. на счет скорости и адекватности кода судить не стану, не вдавался глубоко в его реализацию. По мне - это уже выход из проблемы. В любом случае, это лучше, чем ничего. |
|
09-05-2012 09:05
24-08-2009 16:46const
MaxPointerArraySize = MaxInt div SizeOf(Pointer) - 1;
type
TVarItemArray = array[0..MaxPointerArraySize] of PVarItem;
Зачем выделять такой мега массив?
Здесь объявляется не переменная, а тип. А тип и переменная типа - это две большие разницы. Обычно такие массивы объявляются для того, чтобы объявить тип указателя на такой массив. Тогда такой переменной можно присвоить указатель на произвольный буфер и обращаться к нему как к массиву, самостоятельно следя за невыходом за пределы буфера. |
|
24-08-2009 05:44Также помойму это слишком кошерно:
const
MaxPointerArraySize = MaxInt div SizeOf(Pointer) - 1;
type
TVarItemArray = array[0..MaxPointerArraySize] of PVarItem;
Зачем выделять такой мега массив? |
|
24-08-2009 05:41Совершенно не понятен смысл FKeys, FValues
см.:
procedure TArray.SetItem(Key: Variant; const Value: Variant);
....
FValues^[Index] := FKeys^[KeyIndex];
Inc(FCount);
end;
end;
Получается FValues и FKeys содержат одни и теже данные. Смысл?
|
|
31-07-2009 08:11Как произвести сортировку массива по ключам, а не по значениям? |
|
16-02-2009 14:08Использование интерфейсов не всегда удобно. А автоматический подсчет ссылок для определения времени жизни обьекта - это часто больше головная боль, чем облегчение. Как здесь заметил кто то есть очень неплохая библиотека SDL, там отличный набор контейнеров и методов работы с данными, но и серьезные недостатки:
- как и здесь там все и всегда хранится в variant, т.е. никакой проверки типов при компиляции, постоянные трансформации, значения в памяти хрянятся упакованными в Variant и многие методы обработки данных работать c ними не могут, избыточное использование памяти, ...
- сырая с кучей ошибок и ликами памяти, и похоже никто исправлять не собирается
Еще неплохая библиотека (полный набор типизированных контейнеров, никаких интерфейсов или оберток, чистый Pascal) ADOT (RBS AntiDOT):
http://redbeesoft.com (или http://sourceforge.net/projects/adot)
И есть еще на sourceforge библиотека какая то джедаевская, но она тоже построена на интерфейсах
Мне больше всего AntiDOT нравится :) |
|
25-06-2008 02:38s: IStringArray;
...
s[s.count]:='dfasdf';
в результате:
s[s.count - 1] = 'dfasdf'
s[0] = ''
почему так???
|
|
10-08-2004 15:35сообщение от автора материала На мой взгляд, SDL излишне громоздка и неудобна. Удачной готовой реализации я не нашёл, что и послужило толчком к написанию своей. |
|
31-05-2004 07:38Прошу прощения, но чем не устраивает SDL ??
(DeCAL sourceforge.net)
С уважением,
Сергей |
|
03-11-2003 00:38сообщение от автора материала Моё мнение, Вы излишне категоричны. Но давайте по порядку...
1. Не объявляйте TArray, если хотите автоподсчёт ссылок. Если объявили, то следовательно сами пожелали следить за жизнью объекта.
2. Чтобы возвращать интерфейс, нужно либо описывать по функции на интерфейс, либо инициализировать его многократно перегруженой процедурой (что по сути - то же самое), либо всякий раз использовать "as" при инициализации переменной. Всё это, на мой взгляд, излишнее загромождение кода. Вариант декларации procedure CreateArray(var Obj) тоже не вызывает восторга...
3. Это не COM-объект и как таковой изначально не задумывался. Эта реализация для внутреннего использования в приложении. |
|
30-10-2003 11:08не хочу быть назойливым, но стиль в коде это самоубийство. Объявляем типы не IArray, а TArray, это можно, и прелесть использования автореференсов улетучивается. Это я к тому, что в качестве возвращаемого значения CreateArray надо возвращать интерфейс, а не класс, а реализацию класса полностью запихать в implementation? конечно это вызовет недовольство по поводу возможности наследования, но для этого можно разнести реализацию и интерфейся по разным модулям и воспользоваться регистрацией класса реализации для интерфейсов(сделать Factory). Это будет и с точки программирования правильно - мухи отдельно, котлеты отдельно, и гибкость повышает неимоверно(а ассоциативный массив GUID<->Interface implementor можно сделать на существующем API) |
|
29-10-2003 08:55Дмитрий, так и не понятно, после чего вставлять... может приведешь полностью текст исправленных методов? он ведь небольшой. |
|
28-10-2003 23:00сообщение от автора материала Рекомендую слегка поправить оба модуля (не критично), вставив в методы SetCurrentIndex и SetItem два фрагмента (выделены жирным шрифтом).
// method SetItem
// ...
// начало вставки
if Index >= FCurrentIndex then
SetCurrentIndex(FCurrentIndex + 1)
else
SetCurrentIndex(FCurrentIndex);
// конец вставки
end
else
Index := FCount;
FValues^[Index] := FKeys^[KeyIndex];
Inc(FCount);
end;
end; // of method
// method SetCurrentIndex
// ...
// начало вставки
if FCurrentIndex < 0 then
FBof := True;
// конец вставки
end
else
FEof := False;
end; // of method
|
|
28-10-2003 22:55сообщение от автора материала Static и Variable. Функционально они идентичны. Второй вариант есть модификация первого с возможностью наследования. Может потребоваться для хранения значений собственного типа. В файле TypeTemplate.pas есть шаблон создания наследника.
|
|
28-10-2003 17:38Чем отличается версия с ArrayV.pas от версии с ArrayS.pas ? |
|
28-10-2003 09:31
23-10-2003 10:03
22-10-2003 23:17сообщение от автора материала Да, действительно, в версиях Delphi старше пятой модуль частично неработоспособен, ввиду изменений, коснувшихся типа Variant. Исправленный и дополненный вариант можно посмотреть на
ftp://atlantida.perm.ru/upload/array/Array.zip |
|
22-10-2003 15:11Есть пару ошибок
1) нужно в модуле добавить Variants
2) даже твоя демо не работает нормально в D6, выдает ошибку Invalid Variant Type.
|
|
22-10-2003 15:09Етсть пару ошибок
1) нужно в модуле добавить Variants
2) даже твоя демо не работает нормально в D6, выдает ошибку Invalid Variant Type.
|
|
22-10-2003 12:02Ошибка в URL'е исправлена.
|
|
22-10-2003 10:45Not Found
The requested URL /zip/arrays.zip was not found on this server
|
|
22-10-2003 10:18Классный материал. Я уже не первый год (и не второй) с Дельфи, но о понятии Ассоциативных массивов слышу впервые (в смысле о готовой их реализации в Дельфи) |
|
22-10-2003 08:56404 Not Found
Так и должно быть ? |
|
22-10-2003 08:43Not Found
The requested URL /zip/arrays.zip was not found on this server.
Apache/1.3.26 Server at delphi.mtu-net.ru Port 80 |
|
21-10-2003 21:23Падает на строке M['A']['a'].AsInteger := 1;
(Invalid variant type)
Delphi7 |
|
|
|