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;


 

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

65855. Французская печать XIX века 30.5 KB
  Этапы: Печать эпохи Наполеона I Пресса эпохи реставрации Журналистика июльской монархии Французская печать второй половины 19 века. Перу Наполеона принадлежит 32 тома. Концепция печати Наполеона. У Наполеона было много законов связанных с прессой.
65856. Эпос народов средневековой Европы 46 KB
  Мир эпических текстов как правило полярный его условно можно обозначить как мир своих и чужих как мир добра и зла мир человеческий хтонический демонический несмотря на то что эти миры имеют противоположную компонацию структура этих двух миров зачастую очень схожа.
65857. Феодальная раздробленность в русских землях. Характеристика отдельных княжеств 39 KB
  В середине 12 века князь Юрий Долгорукий несколько раз пытался взять город. Юрий силой захватил Коломну окончательно присоединил Переславль и начал войну с Тверью. В Орде Юрий обвинил Михаила в том что тот не платит дань и в отравлении ханской сестры.
65858. Своеобразие славяно-русского язычества 43.5 KB
  Функции Богов часто переплетались между собой дублировали друг друга. Сначала душу хранит Бог а после жизни очистившись от грехов душа вновь возвращается к нему. Берегиня это богиня породившая всё сущное. Хорс символизировал бога.
65859. Понятие культуры в современной науке 36.5 KB
  Под феноменом культуры понимается все то что создано человеком в результате его приспособления к окружающему природному миру поэтому культура это всё то что человек добавляет к полученному от природы и то новое что он создает иногда вопреки законам природы...
65861. Человек и среда обитания 24.72 KB
  Жизнедеятельность это повседневная деятельность и отдых способ существования человека. Среда обитания окружающая человека среда обусловленная совокупностью факторов физических химических биологических информационных социальных способных оказывать прямое...
65862. Этнография и этнология 26.5 KB
  В 19 веке начинает складываться теоретические основы антропологии и кроме термина антропология начинают активно использоваться термины этнография и этнология. В англоязычных странах был предпочтительнее антропология. Основные подходы к изучению проблем человека: Философский появляется...
65863. Микропроцессорные системы (МП системы) 90.5 KB
  Модуль вода вывода является специфическим для управляющих систем и содержит узлы позволяющие общаться с внешними переферийными устройствами датчиками и исполнительными механизмами. Периферийные устройства работающие с системой могут быть многочисленными.