TList
Một kiểu generics lưu trữ các đối tượng
Một kiểu generics lưu trữ các đối tượng
Kiểu TList là một kiểu generics trong unit System.Generics.Collections, dùng lưu trữ các đối tượng cùng kiểu như string, integer, ... TList tương tự với mảng động nhờ tự động phân bổ bộ nhớ. Bên cạnh đó, TList còn kèm theo nhiều method tiện ích như Sort, BinarySearch, Contains, IndexOf, Move, ... để dễ dàng thao tác hơn.
Các phần sau sẽ trình bày một số thao tác cơ bản trên TList.
Vì TList là một kiểu generics nên bạn cần khai báo nó chung với một kiểu dữ liệu thuần như string, interger, boolean. Khi ấy, các phần tử của TList đều mang kiểu dữ liệu đó.
var
IntList: TList<integer>;
StrList: TList<string>;
Kiểu generics được khai báo như trên. Vì TList là một generics class nên cần khởi tạo trước khi sử dụng. Sử dụng cấu trúc try ... finally để quản lý bộ nhớ.
begin
IntList := TList<integer>.Create;
try
...
finally
IntList.Free;
end;
end;
Những câu lệnh xử lý TList được đặt tại vị trí ba chấm (...)
TList có cách sử dụng khá giống với TStringList với những thuộc tính như Count (số lượng) hoặc truy cập như mảng TList[i]. Do vậy, để in tất cả phần tử của TList ra màn hình, chúng ta làm tương tự TStringList
var
i: Integer;
begin
...
for i := 0 to IntList.Count - 1 do
write(IntList[i], ' ');
end.
TList có hai method là Add (thêm 1 giá trị) và AddRange (thêm nhiều giá trị).
IntList := TList<integer>.Create;
try
IntList.Add(10);
IntList.AddRange([10, 5, 7, 8, 11]);
finally
IntList.Free;
end;
Chú ý method AddRange, bạn cần truyền đối số là một mảng động các hằng trong cặp [ và ] như trên.
Nếu khai báo TList<string> thì Add và AddRange cần truyền vào là các phần tử string.
StrList.Add('ABC');
StrList.AddRange(['12', 'AD', 'R']);
Bên cạnh Add và AddRange, cũng có 2 method gần giống là Insert và InsertRange. Add thì thêm các phần tử vào cuối list, Insert thì có thể thêm vào vị trí xác định.
IntList.Insert(4, 34); // Chèn số 34 vào vị trí thứ 5 (index = 4)
IntList.InsertRange(0, [1, 2, 3]); // Chèn ba số 1, 2, 3 vào đầu, vị trí thứ 1 (index = 0)
Có hai cách xóa phần tử khỏi TList:
Dùng method Remove: xóa 1 phần tử có giá trị xác định, từ trái sang phải
Dùng method Delete và DeleteRange: xóa 1 phần tử tại một vị trí nào đó
IntList.AddRange([1, 2, 4, 2, 5, 6]);
IntList.Remove(2); // Còn lại 1, 4, 2, 5, 6
IntList.Delete(3); // Còn lại 1, 4, 2, 6
IntList.DeleteRange(1, 2); // Còn lại 1, 6
Chú ý: Các hàm lấy index từ 0, nên Delete(3) là xóa phần tử thứ 4
Method DeleteRange(1, 2) xóa 2 số từ vị trí thứ 1 (là phần tử thứ 2)
Để kiểm tra xem TList có chứa một giá trị nào đó không, chúng ta sử dụng method Contains, trả về một kiểu boolean
if IntList.Contains(2) = true then
writeln('List co chua so 2')
else
writeln('List khong chua so 2');
Nếu bạn cần biết chính xác vị trí được tìm thấy, thì dùng method IndexOf. Hàm này trả về vị trí của 1 giá trị trong list, nếu không tìm thấy thì trả về -1
var
FoundAt: Integer;
begin
...
FoundAt := IntList.IndexOf(2);
if FoundAt = -1 then
writeln('Khong tim thay 2')
else
writeln('Tim thay so 2 tai vi tri ', FoundAt);
end;
Thêm nữa, nếu trước đó TList đã được sắp xếp (tăng dần hoặc giảm dần) thì nên dùng BinarySearch để có được tốc độ nhanh hơn. Hàm này có tham số thứ 2 là một out parameter nên bạn cần đặt đối số thứ 2 là 1 biến. Hàm trả về kiểu boolean, true nếu tìm thấy và false nếu không có.
var
FoundAt: Integer;
begin
...
if IntList.BinarySearch(2, FoundAt) = false then
writeln('Khong tim thay 2')
else
writeln(Tim thay so 2 tai vi tri ', FoundAt);
end;
Bên cạnh đó, TList còn cung cấp một số các method khác như Sort (sắp xếp), Reverse (đảo ngược).
IntList.AddRange([1, 3, 2, 4, 10]);
IntList.Sort; // [1, 2, 3, 4, 10]
IntList.Reverse; // [10, 4, 3, 2, 1]
Method TList.Sort mặc định là sắp xếp tăng dần, bạn có thể kết hợp Sort và Reverse để sắp xếp giảm dần như trên.
Mẹo: TList còn có nhiều hàm, thủ tục hay ho khác. Bạn có thể dùng Code Insight để hiển thị danh sách các method khác của TList.