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;


 

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

75569. Найбільші бібліотеки світу. Бібліотека Британського музею - одне з визначних місць Лондона 59 KB
  Т: Do you sometimes borrow books from librry Wht do you cll person who works in librry Wht kind of books cn you find there Do you know the origin of the word Librry б Т: Listen nd repet. HO1: Librries The word librry comes from the Ltin word liber mening book This is plce where informtion in print books mnuscripts periodicls nd musicl scores nd in other forms is collected nd rrnged to serve people of ll ges nd interests. Perhps the most fmous librry of tht erly...
75570. Наша шкільна бібліотека. Як англійці пишуть листи 60.5 KB
  Обладнання: підручник комплект Jigsw sentences for Wrmup НО1 зразок написання приватного листа Н02 Jumbled prts of the informl letter H03 текст The rt of LetterWriting H04 True or Flse HO5. Т: The topic of our tody\'s lesson is The wy Englishmen write letters nd The rt of LetterWriting . By the end of the lesson you should be ble: to get cquinted with the lyout of informl letter nd some rules tht you should follow if you wnt to write n interesting letter to your friend; to improve your communictive writing skills; to tlk...
75571. Національні традиції Великобританії, План-конспект уроку з англійської мови для учнів 9-х класів 53.5 KB
  Практикувати учнів у читанні тексту з метою отримання загального уявлення (skimming) та максимально повного й точного розуміння всієї інформації, що міститься в ньому (scanning). Підготувати учнів до самостійного висловлювання про національні традиції Великобританії на основі інформації, що міститься в тексті.
75572. Генрі - великий американський письменник. Контроль позакласного читання 74 KB
  Практикувати учнів в аудіюванні з метою максимально повного та точного розуміння всіє інформації, що міститься в тексті. Проконтролювати підготовку позакласного читання.
75574. Сполучені Штати Америки, План-конспект уроку з англійської мови для учнів 9-х класів 68.5 KB
  Обладнання: підручник географічна карта США граматична таблиця Узгодження часів в англійській мові пісня meric the Beutiful НО1 текст Kthrine Lee Btes H02 True or Flse H03 Keyfcts H04. Т: The topic of our todys lesson is The geogrphicl position of the United Sttes of meric...
75575. Географічне положення Сполучених Штатів Америки, План-конспект уроку з англійської мови для учнів 9-х класів 55.5 KB
  Обладнання: підручник географічна карта США граматична таблиця Узгодження граматичних часів в англійській мові Mtch the pirs НО1; таблиця The Sequence of Tenses H02. Т: The topic of our...
75576. Нью-Йорк - найбільше місто США 61.5 KB
  Т: Tody we re going to tlk bout New York the lrgest city in the US. Предявлення тексту для читання New York впр.Т: Wht do you think Why do people like to trvel to different countries nd cities Do you wnt to know more bout the world too Why Comment the quottion of Jmes Bone New York is the city of dredful heightrdquo;.New Yorkthe Hudson RiverMnhttnBrodwyWll StreetStock Exchnge в Do you know wht the following words menВиконання впр.
75577. Визначні та пам’ятні місця США. Узгодження часів в англійській мові 73.5 KB
  Обладнання: підручник географічна карта США граматична таблиця The Sequence of Tenses HO1 Chnge the pronouns nd dverbs H02 Wht do they chnge for H03 Detective Dniels’ Report H04 True or Flse HOs. The def reporter sks Wht did he she sk nd wht did he she sy The student who sked the question reports his her question nd the nswer he she got. Word flshcrds: How old re you Where do you live re you mrried Hve you ever been to Mdrid before Do you like Spnish food re you stying here long Hve you visited Toledo Whos your...