Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Полигон
  
 

Фильтр по датам

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  06:33[Войти] | [Зарегистрироваться]

Обсуждение материала
Реализация ассоциативных массивов в Delphi
Полный текст материала


Другие публикации автора: Дмитрий Рябов

Цитата или краткий комментарий:

«... На практике часто возникает потребность сохранять и обрабатывать данные в массивах, осуществляя доступ к элементам не по индексу, а по ключу. Для этого используются ассоциативные массивы, которые есть, например, во многих скриптовых языках. ...»


Важно:
  • Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
  • Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
  • При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
  • Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.



Добавить свое мнение.




Смотрите также материалы по темам:
[Массивы]

Комментарии жителей
Отслеживать это обсуждение

Всего сообщений: 29

07-05-2014 13:18
Стандартный принцип для автофинализируемых типов, к коим относятся и интерфейсы: пока жива хотя бы одна переменная, ссылающаяся на данный объект, объект будет жить.
 Geo


07-05-2014 10:40
В функции Main написано

// перед возвратом все созданные массивы автоматически удаляются
  WriteLn('Arrays is free');


Как сделать так, чтобы они не удалялись?


18-02-2013 11:17
Вообще очень даже неплохо. Познакомился с ассоциативными массивами в PHP. Поднял вопрос о реализации их в Дельфи. Этот модуль позволяет построить более понятный и качествнный код, поскольку использование многомерных ассоциативных массовов для обработки данных может упростить задачу многократно. на счет скорости и адекватности кода судить не стану, не вдавался глубоко в его реализацию. По мне - это уже выход из проблемы. В любом случае, это лучше, чем ничего.


09-05-2012 09:05
Модуль ассоциативных списков

AssocList

Документация на модуль:
http://jqbook.narod.ru/delphi_assoc.html

Код модуля:
http://jqbook.narod.ru/files/delphi_assoc/assocList.pas.html

Пример:

var List:TAssocList; s:string;
begin
// создание списка
List:=TAssocList.Create;

// вставка в список путем присваивания

List['hello']:='world';
List['apple']:='green';

// вставка в список через процедуру

List.Add('tree','red');

// показ содержимого списка

ShowMessage(List.Text);

// изменение

List['hello']:='Alex';

// показ содержимого списка

ShowMessage(List.Text);

// поиск

s:=List.indexOf('green');
ShowMessage(s); // apple

// сохранение списка в файл

List.SaveToFile('C:\1.txt');

List.Free; // освобождение памяти списка
end;



24-08-2009 16:46
const
  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;



Зачем выделять такой мега массив?
 KES


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 содержат одни и теже данные. Смысл?

 KES


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:38
s: IStringArray;
...
s[s.count]:='dfasdf';
в результате:
s[s.count - 1] = 'dfasdf'
s[0] = ''
почему так???


10-08-2004 15:35
сообщение от автора материала
На мой взгляд, SDL излишне громоздка и неудобна. Удачной готовой реализации я не нашёл, что и послужило толчком к написанию своей.
 Dimk


31-05-2004 07:38
Прошу прощения, но чем не устраивает SDL  ??
(DeCAL sourceforge.net)

С уважением,
        Сергей


03-11-2003 00:38
сообщение от автора материала
Моё мнение, Вы излишне категоричны. Но давайте по порядку...
1. Не объявляйте TArray, если хотите автоподсчёт ссылок. Если объявили, то следовательно сами пожелали следить за жизнью объекта.
2. Чтобы возвращать интерфейс, нужно либо описывать по функции на интерфейс, либо инициализировать его многократно перегруженой процедурой (что по сути - то же самое), либо всякий раз использовать "as" при инициализации переменной. Всё это, на мой взгляд, излишнее загромождение кода. Вариант декларации procedure CreateArray(var Obj) тоже не вызывает восторга...
3. Это не COM-объект и как таковой изначально не задумывался. Эта реализация для внутреннего использования в приложении.
 Dimk


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
 Dimk


28-10-2003 22:55
сообщение от автора материала
Static и Variable. Функционально они идентичны. Второй вариант есть модификация первого с возможностью наследования. Может потребоваться для хранения значений собственного типа. В файле TypeTemplate.pas есть шаблон создания наследника.
 Dimk


28-10-2003 17:38
Чем отличается версия с ArrayV.pas  от версии с ArrayS.pas ?


28-10-2003 09:31
сообщение от автора материала
На королевстве лежит исправленный вариант.
http://delphi.mtu-net.ru/zip/arrays.zip
 Dimk


23-10-2003 10:03
по этому адресу не скачивается:

ftp://atlantida.perm.ru/upload/array/Array.zip


22-10-2003 23:17
сообщение от автора материала
Да, действительно, в версиях Delphi старше пятой модуль частично неработоспособен, ввиду изменений, коснувшихся типа Variant. Исправленный и дополненный вариант можно посмотреть на
ftp://atlantida.perm.ru/upload/array/Array.zip
 Dimk


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:45
Not Found
The requested URL /zip/arrays.zip was not found on this server



22-10-2003 10:18
Классный материал. Я уже не первый год (и не второй) с Дельфи, но о понятии Ассоциативных массивов слышу впервые (в смысле о готовой их реализации в Дельфи)


22-10-2003 08:56
404 Not Found
Так и должно быть ?


22-10-2003 08:43
Not 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


Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Какой месяц идет после марта?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования