Използване на стандартни Delphi дженерици за работа с набори от данни
Започвайки с версия 2009, Delphi добави поддръжка на език и компилатор за родови типове или генерици (известни също като параметризирани типове), аналог на шаблони в C ++. Заедно с тези промени се появи модулът System.Generics.Collections, който се използва за работа с масиви и групиране на данни в речници, списъци, стекове и опашки. За тази единица и за работата с нея ще говорим тук.
Статията е предназначена за читатели, които имат представа какво е родов тип или шаблон. Тук ще обмисля само използването на уреда. System.Generics.Collections. Ще бъдат разгледани основните класове, които са внедрени в него, и ще бъдат дадени примери за използване. Всички дадени примери са направени за Delphi XE7 и тяхното представяне в други версии Делфи не е гарантирано.
Клас TArray мерна единица System.Generics.Collections съдържа статични методи за търсене (BinarySearch) и сортиране на масива (Вид). Когато търсите с помощта на функцията BinarySearch използва двоично търсене, използвайки O (log n) алгоритъм, където н - броя на елементите в масива. Нека да видим пример за използване на класа TArray.
Обърнете внимание, че родовият тип за масив (TArray ), дефинирани в единица Система, и в единицата System.Generics.Collections дефиниран е само помощен клас, който може само да сортира масив и да търси в него.
Сега нека разгледаме вариант на сортиране с помощта на наш собствен компаратор (компаратор). Да кажем, че в примера трябва да сортираме низовете не по азбучен ред, а според нашия собствен алгоритъм.
TDictionary и TObjectDictionary
Речник TDictionary или TObjectDictionary Е колекция от двойки ключ-стойност. Разликата между тези два класа е, че вторият клас е в състояние автоматично да изтрива копия на обектни ключове и/или обектни стойности, т.е. можете да използвате екземпляри на обекти като ключове или стойности.
Можете да добавите ключ със съответната стойност към речника с помощта на методите Добавяне (ще върне грешка, ако се опитате да добавите ключа отново) или AddOrSetValue (ще замени стойността за ключа, ако ключът вече е в колекцията). Можете да изтриете речникови елементи с помощта на Премахване (премахване на един елемент) и Ясно (пълно почистване на речника). Събитията могат да бъдат полезни OnKeyNotify и OnValueNotify, които се случват при добавяне, промяна или премахване на двойка (трябва да се има предвид, че за една операция могат да възникнат няколко събития).
Добавянето или премахването на двойка ключ-стойност, както и четенето на стойност по ключ са ефективни, близо до O (1), от хеш таблица се използва за съхраняване на двойките. Ключовете не могат да бъдат нула, и ценности - може.
Можете да разберете дали ключ или стойност е в речника с помощта на методите TryGetValue (опитва се да прочете стойността по ключ), СъдържаКлюч (проверява за наличие на ключ) и Съдържа стойност (проверява за съществуването на стойност). Можете да прочетете стойността по ключ, като използвате свойството Елементи, разберете броя на двойките в речника - използвайки свойството Броя. Можете да получите списък с всички ключове от имота Ключове, и стойности от имота Стойности.
Нека разгледаме няколко опции за използване на речници.
Сега нека разгледаме по-сложна опция, когато екземпляр на клас се използва като ключ. Ние също така дефинираме наш собствен компаратор за ключа (компаратор).
TList и TObjectList
Списък TList или TObjectList Представлява подреден списък, чиито елементи са достъпни чрез индекс. Разликата между тези класове е, че вторият клас може автоматично да изтрива екземпляри на елементи, когато те бъдат премахнати от списъка.
Можете да добавяте или вмъквате елементи в списъка, да ги променяте и изтривате. Можете да добавите нула. Когато списъкът се промени, събитието се задейства OnNotify.
Списъкът може да бъде сортиран с помощта на стандартни или персонализирани сравнителни устройства. Можете да търсите в него и да направите обратен ход.
Имот Броя показва броя на елементите в списъка и Капацитет - броят на запазените места. Можете да четете елемент по индекс, като използвате свойството Елементи.
Ето пример за използване на обекта TList.
Използване на обект TObjectList много подобен, така че просто ще ви покажа пример, който ще покаже допълнителни фини точки.