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;


 

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

64534. Конкуренция как экономическая категория. Понятие и виды конкуренци 21 KB
  Количество конкурентов как уже имеющихся так и потенциально должно быть достаточным для того чтобы устранить экстраординарные доходы Все экономические агенты должны обладать приемлемым знанием рыночных возможностей...
64535. КАУЧУКИ И РЕЗИНОВЫЕ МАТЕРИАЛЫ 95 KB
  Резины - продукты вулканизации натурального или синтетических каучуков и представляют собой многокомпонентные смеси. Резиновая смесь изготавливается путем введения в каучуки минеральных или углеродных порошкообразных наполнителей
64536. Теории происхождения государства и права 36 KB
  Изучение процесса происхождения государства и права имеет не только теоретическое. Изучение процесса происхождения государства и права позволяет понять социальную сущность государства установить место и роль государства в жизни общества.
64537. ОСОБЕННОСТИ РАЗВИТИЯ СТРАН АЗИИ И АФРИКИ. ЯПОНИЯ В 20—30-е ГОДЫ 20.88 KB
  Влияние войны и революции в России на страны Азии и Африки. В зоне военных действий оказались страны Ближнего Востока в армиях Антанты участвовали солдаты ряда колоний. Страны Азии и Африки составляли важный резерв сырья и продовольствия а также рабочей силы.
64538. ОБЩЕТЕОРЕТИЧЕСКИЕ АСПЕКТЫ БЕЗОПАСНОСТИ ЖИЗНЕДЕЯТЕЛЬНОСТИ 66.5 KB
  Под безопасностью понимают состояние деятельности при котором с достаточной вероятностью исключено проявление опасностей или отсутствие явной опасности. Количественной оценкой опасности служит риск который определяется как частота или вероятность появления...
64539. Возникновение понятия «маркетинг». Исторические концепции маркетинга 69.87 KB
  Суть концепции Любой товар будет пользоваться спросом если он доступен по цене и широко представлен на рынке. Особенности концепции Деятельность фирмы ориентирована только на возможности производства не на потребности общества.
64540. Правовой статус Великого княжества Финляндского(ВКФ) и Царства Польского (ЦП) на этапе вхождения данных территорий в состав Российской империи 18.47 KB
  На момент вступления ВКФ в состав РИ финский этнос представлял собой малый молодой крестьянский этнос изза гнета Швеции национальная элита так и не сформировалась население исповедовало лютеранство что объясняло почти 100 грамотность населения...
64541. Основа национальной политики царизма и ее особенности на рубеже XIX – XX веков 54 KB
  На протяжении всей истории, Россия руководствовалась 6 принципами национальной политики, которые выражаются в: сотрудничестве с национальными элитами и стремление растворить...