Средства разработки приложений

Список указателей TArrayList


TArrayList является аналогом класса ArrayList из .NET Framework. Он предназначен для хранения набора указателей. В конструктор класса передается предполагаемое число элементов, которое будет добавлено в список. Элементы можно загрузить методом Load из другого экземпляра класса TArrayList или из указанной области памяти. Отдельные элементы добавляются методом Add в конец списка или методом Insert в произвольное место списка. Для удаления элемента по индексу используется метод RemoveAt. Если элемент содержит ссылку на объект, производный от TObject, вызов метода RemoveAndFreeItemAt не только удалит элемент из списка, но и освободит занимаемую им память вызовом TObject.Free. Методы UnorderedRemoveAt и UnorderedRemoveAndFreeItemAt, аналогичны двум предыдущим. Они позволяют быстро удалить элемент из списка, заменив его последним элементом списка и уменьшив на 1 значение свойства Count. Эти методы могут применяться, когда порядок элементов не имеет значения. Для полной очистки списка предназначен метод Clear; для очистки списка с вызовом метода Free для каждого элемента используется метод ClearAndFreeItems. Аналогично классам TIntegerList, TWordList, в классе TArrayList имеются методы для работы со списком как со стеком. Метод Pop возвращает последний элемент списка и одновременно удаляет его, уменьшая на 1 значение свойства Count. Метод Peek возвращает последний элемент списка, не удаляя его. Поместить элемент в стек можно с помощью метода Add.

Обращение к отдельным элементам списка осуществляется через свойство ItemList, которое возвращает ссылку на массив указателей типа Pointer. Длина списка возвращается свойством Count. Общее число элементов, под которое распределена память во внутреннем массиве, определяется свойством Capacity. Свойство Count может произвольным образом изменяться. Никаких проверок при этом не выполняется. Capacity обычно превышает Count, что позволяет добавлять новые элементы в список без немедленного выделения нового блока памяти. Чтобы предельно уменьшить объем памяти, занимаемый списком, можно вызвать метод TrimToSize, который распределяет под внутренний массив область памяти, достаточную для хранения Count элементов, но не более того.
После вызова этого метода свойство Capacity становится равно свойству Count. Метод Clone возвращает копию экземпляра класса TArrayList. Метод Equals поэлементно сравнивает текущий список с заданным списком и возвращает True, если все элементы, т.е. указатели, обоих списков равны, или False, если между списками есть какие-либо различия. Чтобы найти элемент в списке TArrayList можно воспользоваться функцией IndexOf, которая сканирует внутренний массив в поисках нужного указателя. Если надо найти не просто указатель, а элемент с определенным значением признака, придется перебрать в цикле все элементы массива ItemList. Для более эффективного поиска, а также просто для упорядочивания элементов списка, можно отсортировать список методом Sort. Данный метод принимает в качестве параметра адрес функции, сравнивающей два элемента списка. Элементы сортируются по возрастанию. Когда список отсортирован, для нахождения элемента методом бинарного поиска можно воспользоваться функцией Search, которая принимает два параметра: указатель на искомое значение признака и функцию для сопоставления элемента списка с этим значением. Имеется также модификация этого метода, которая принимает два указателя на искомые значения, например, для поиска улицы в определенном городе, если эти признаки находятся в разных полях записи, описывающей адрес. В классе TArrayList предусмотрена возможность группирования элементов. При этом элементы с одинаковым значением признака объединяются в одну группу. Группирование выполняется методом EnumerateGroups, который принимает в качестве параметра адрес функции, сравнивающей два элемента списка. При выполнении этой операции список сортируется в порядке возрастания значения признака. Функция EnumerateGroups возвращает коллекцию групп – экземпляр класса TGroupEnumerator. Число групп в этой коллекции определяется свойством GroupCount. Указатель на массив, содержащий группы, возвращается свойством GroupList класса TGroupEnumerator. Каждая группа представляется списком TArrayReadOnlyList – аналог класса TArrayList, который не позволяет добавлять и удалять элементы.Свойство ItemList этого класса возвращает указатель на массив, содержащий элементы группы. Количество элементов можно определить с помощью свойства Count. В классе TArrayReadOnlyList предусмотрены методы для линейного поиска указателя (IndexOf), для сортировки элементов группы (Sort), для бинарного поиска (Search), для выделения подгрупп (EnumerateGroups). Следует обратить внимание на то, что в экземпляре класса TArrayReadOnlyList нет собственного внутреннего массива для хранения элементов списка. Вместо этого он пользуется внутренним массивом экземпляра класса TArrayList, для которого был вызван метод EnumerateGroups. Поэтому в процессе работы с группами нельзя вносить изменения в основной экземпляр TArrayList.

Содержание раздела