9682

Класс TList - списки

Лекция

Информатика, кибернетика и программирование

Класс TList - списки Класс TList позволяет создать набор из произвольного количества элементов и организовать индексный способ доступа к ним, как это делается при работе с массивом. Списки отличаются от массивов двумя важными особенностями...

Русский

2013-03-15

57 KB

3 чел.

Класс TList – списки

Класс TList позволяет создать набор из произвольного количества элементов и организовать индексный способ доступа к ним, как это делается при работе с массивом. Списки отличаются от массивов двумя важными особенностями. Во-первых, их размер может динамически меняться в ходе работы программы, фактически ограничиваясь лишь доступной памятью. Во-вторых, в списках могут храниться элементы разных типов.

Технически списки представляют собой массивы нетипизированных указателей на размещенные в динамической памяти элементы. Эти массивы размещаются в куче - отсюда возможность динамического изменения размеров списков; с другой стороны, входящие в списки нетипизированные указатели позволяют ссылаться на произвольные элементы.

Свойства класса:

property Capacity: Integer;

Содержит количество элементов массива указателей коллекции; всегда больше Count. Если при добавлении очередного элемента Count стало равно Capacity, происходит автоматическое расширение списка на 16 элементов.

property Count: Integer;

Количество элементов списка. Это свойство изменяется при добавлении или удалении элемента.

property Items (Index: Integer): Pointer;

Возвращает указатель на элемент списка по его индексу. Самый первый элемент списка имеет индекс 0.

property List: pPointerList;

Возвращает указатель на массив элементов списка.

Тип pPointerList определен следующим образом:

type

pPointerList = ^TPointerList;

TPointerList = array [0..MaxListSize] of Pointer;

Константа MaxListSize для Delphi 1.0 ограничена значением 16379 элементов. Для старших версий Delphi она ограничивается доступной памятью.

Следует учесть, что свойство Count определяет количество помещенных в список элементов, в то время как Capacity - текущую емкость списка. Если при добавлении очередного элемента обнаруживается, что емкость списка исчерпана, происходит наращивание емкости на фиксированную величину (для Count меньше 5 - на 4 элемента, для Count в диапазоне 5...7 - на 8, для Count больше 7 - на 16). При этом сначала резервируется память для размещения расширенного массива указателей, затем в нее копируется содержимое старого массива, после чего старый массив указателей уничтожается (занимаемая им память возвращается Windows). Если вы заранее знаете, сколько элементов необходимо поместить в список, установите в начале работы нужное значение в свойство Capacity - это снизит непроизводительные затраты времени на расширение списка.

Методы класса:

function Add (Item: Pointer) : Integer;

Добавляет элемент Item в конец списка и возвращает его индекс.

procedure Clear;

Очищает список, удаляя из него все элементы. Не освобождает память, связанную с каждым удаленным элементом. Устанавливает в свойства Count и Capacity значение 0.

procedure Delete (Index: Integer) ;

Удаляет из списка элемент с индексом Index. Все элементы, расположенные за удаляемым, смещаются на одну позицию вверх.

procedure Exchange (Index1, Index2 : Integer);

Меняет местами элементы с индексами Index1 и Index2.

function Expand: TList;

Расширяет массив элементов, увеличивая Capacity.

function First: Pointer;

Возвращает указатель на самый первый элемент списка.

function IndexOf (Item: Pointer) : Integer;

Отыскивает в списке элемент Item и возвращает его индекс.

procedure Insert (Index: Integer; Item: Pointer) ;

Вставляет элемент Item в позицию Index списка: новый элемент получает индекс Index, все элементы с индексами Index и больше увеличивают свой индекс на 1. При необходимости расширяет список.

function Last: Pointer;

Возвращает указатель на последний элемент списка.

procedure Move (CurIndex, NewIndex: Integer) ;

Перемещает элемент в списке с позиции CurIndex в позицию NewIndex. Все элементы старого списка с индексами от CurIndex-1 до NewIndex уменьшают свой индекс на 1.

procedure Pack;

Упаковывает список: удаляет пустые элементы в конце массива индексов.

function Remove (Item: Pointer) : Integer;

Отыскивает в списке элемент Item и удаляет его.

procedure Sort (Compare: TListSortCompare) ;

Сортирует коллекцию с помощью функции Compare.

Методы Add и Insert получают указатель на вставляемый элемент. Чтобы воспользоваться ими, программист должен сам разместить в куче данные и получить соответствующий указатель. Точно так же методы Delete, Remove и Clear не уничтожают распределенные в памяти данные, которые программист должен, если это необходимо, уничтожить сам. Например:

var

 List: TList;

 Item: Pointer;

 Value: AnyType;

begin

 List := TList.Create; // Создаем список

 Item := New(Value);  // Размещаем в куче данные

 List.Add(Item);  // Добавляем элемент к списку

 List.Remove(Item);  // Удаляем элемент из списка

 . . . . . . . .

 Dispose(Item);   // Удаляем его из кучи

 List.Free;    // Удаляем ненужный список

end;

Метод Sort сортирует список по критерию, устанавливаемому функцией Compare. Тип TListSortCompare определен следующим образом:

TListSortCompare = function(Item1,Item2:Pointer):Integer;

Таким образом, функция Compare получает указатели на два элемента списка. Результат сравнения:

  •  любое отрицательное число, если Item1^ < Item2^;
  •  0, если Item1^ = Item2^;
  •  любое положительное число, если Item1^ > Item2^.

Критерий сравнения данных устанавливается программистом и реализуется в функции Compare.

В следующем примере в список List помещается 20 случайных вещественных чисел, равномерно распределенных в диапазоне 0...1. Список сортируется по возрастанию чисел и отображается в компоненте mmOutput (многострочный редактор из лабораторной работы № 4).

type

 PDouble = ^Double; {Этот тип используется для приведения нетипизи-
       рованных указателей к указателям на вещественный тип Double}

 function Comp(Item1, Item2: Pointer): Integer;

 // С помощью этой функции реализуется сортировка чисел

 begin

   if PDouble(Item1)^ < PDouble(Item2)^ then

     Result := -1

   else if PDouble(Item1)^ > PDouble(Item2)^ then

     Result := 1

   else

     Result := 0

 end;

 procedure TfmExample.bbRunClick(Sender: TObject);

 // Обработчик нажатий кнопки bbOk выполняет основную работу

 var

   k: Integer;

   List: TList;

   pD: PDouble;

 begin

   List := TList.Create; // Создаем список

   for k := 1 to 20 do  // Наполняем его

   begin

     New(pD);    // Резервируем память

     рD^ := Random;  // Помещаем в нее случайное число

     List.Add(pD);   // Добавляем к списку

   end;

   List.Sort(Comp);  // Сортируем список по возрастанию

   mmOutput.Lines.Clear; // Очищаем редактор mmOutput

   {В следующем цикле наполняем mmOutput и уничтожаем элементы List}

   for k := 0 to List.Count-1 do

   begin

     pD := List[k]; // Очередное число из списка

     mmOutput.Lines.Add(FloatToStr(pD^)); // Помещаем в mmOutput

     Dispose(pD)      // Уничтожаем число

   end;

   List.Free;       // Уничтожаем список

 end;


 

А также другие работы, которые могут Вас заинтересовать

42562. Розрахунок природного освітлення 121 KB
  Нормоване значення коефіцієнту природного освітлення приміщення для заданих умов. Виконати перевірочний розрахунок бокового природного освітлення методом світлового коефіцієнта. 2 Виконаємо розрахунок бокового природного освітлення методом коефіцієнта природного освітлення: Розрахунок бокового природного освітлення приміщення базується на такій формулі Sвік. де Sвік – площа вікон Sпідл – площа підлоги КПОN – нормоване значення КПО КЗ – коефіцієнт запасу НВ – світлова характеристика вікон Кбуд –...
42564. Гиперссылки в HTML-документах 36 KB
  Гиперссылки в HTMLдокументах Шаблон элемента гиперссылки имеет вид: href= Адрес ссылки текст для щелчка отсылающий по адресу ссылки Каждый документ файл в Интернете имеет адрес называемый Универсальным указателем ресурсов uniform resource loctor URL Поэтому атрибут href элемента гиперссылки А задающий адрес ссылки в общем случае имеет шаблон: href= URL или href= Протокол: Адрес ссылки Ссылки к ресурсам Интернета по протоколу HTTP Атрибут href задающий адрес ссылки в случае обращения к WEBресурсу Интернета имеет шаблон: href=...
42565. Текстовый редактор Microsoft Word 427 KB
  Харьков 2010 Цель работы: получить практические навыки работы в текстовом редакторе Microsoft Word. Порядок выполнения работы: Запустить текстовый редактор Word. Выполнить рисунок в графическом редакторе Pint и поместить его на лист редактора Word.
42566. Организация HTML-документов с помощью фреймов 48 KB
  Организация HTMLдокументов с помощью фреймов Фреймы это области которые создаются в окне браузера для одновременного просмотра нескольких документов. При создании страницы с фреймами разрабатывается несколько HTMLфайлов которые отличаются по своему назначению. Шаблон элемента FRMESET Для создания WEBстраницы с фреймами в языке HTML существует элемент FRMESET. Второй этап создания страницы с фреймами: подготовка HTMLфайлов для каждой области деления экрана с помощью элемента FRME В документе раскладки элемент FRMESET используется...
42567. Понятие социального статуса. Виды статусов 15.41 KB
  Социальный статус — это общее положение личности (группы) в обществе, связанное с определенными правами и обязанностями. Например, статус врача дает индивиду право заниматься лечебной практикой и в то же время обязывает врача исполнять свои функции и роли надлежащим образом
42569. Управление режимами энергосистем и автоматизации 101.5 KB
  Харьков 2011 ТЭС1 : Рэ1=8952 МВт Ропт1=1164 МВт ТЭС2 : Рэ2=1243 МВт Ропт2=1536 МВт ТЭС3 : Рэ3=4899 МВт Ропт3=4867 МВт – необходимо оптимизировать. Блок 31 Блок 32 Блок 33 Отключаем блок №3 ТЭС3 ТЭС1 : Рэ1=8952 МВт Ропт1=1164 МВт ТЭС2 : Рэ2=1243 МВт Ропт2=1536 МВт ТЭС3 : Рэ3=3298 МВт Ропт3=3744 МВт.
42570. Дослідження базових схем підсилюваньних каскадів на польових транзисторах 168 KB
  Среди базовых каскадов на полевых транзисторах на практике наибольше распространение получили каскады с общим истоком аналог ОЭ и истоковые повторители аналог ОК показанные в двух модификациях на рис.4 и отличающиеся способом реализации статического режима: смещение обеспечивается или за счет падения напряжения на резисторе включенном в цепь истока рис. 4 а в или за счет подачи на затвор дополнительного напряжения рис. Рис.