Delphi TDictionary字典類

一曲轻扬發表於2024-03-12

TDictionary 是一個開放雜湊表,支援泛型,並提供了以下常用屬性和方法:

屬性:

Count:返回字典中元素的數量。
Keys:返回字典中所有鍵所組成的動態陣列。
Values:返回字典中所有值所組成的動態陣列。

方法:

Add:向字典中新增一個鍵和其對應的值。
Clear:清空字典中的所有元素。
ContainsKey:判斷字典中是否包含指定的鍵。
ContainsValue:判斷字典中是否包含指定的值。
Remove:從字典中刪除指定的鍵以及對應的值。
TryGetValue:嘗試從字典中獲取指定鍵所對應的值。
GetEnumerator:返回一個用於列舉字典中元素的物件(TDictionary<_,_>.TPairEnumerator 型別)。

除此之外,TDictionary 還提供了一些其他方法和事件,如 `OnChange`, `TrimExcess`, `IndexOfKey` 和 `IndexOfValue`。具體用法可以參考 Delphi 文件或自行搜尋。

宣告與建立時,需要指明K與V的資料型別,比如:

var 
    dic: TDictionary<string, integer>;
begin
    dic := TDictionary<string, Integer>.Create;
end;

示例一:對資料(陣列)去重.以下程式碼實現了對陣列元素的去重:

// RemoveDuplicates 函式接受一個字串陣列作為輸入,使用字典來記錄陣列中的唯一元素,並返回去重後的陣列。
function RemoveDuplicates(const arr: TArray<string>): TArray<string>;
var
  dic: TDictionary<string, Boolean>; // 宣告 TDictionary 用於記錄唯一元素,值為 Boolean 表示只需記錄鍵而不需值
  value: string; // 用於遍歷輸入陣列中的元素
begin
  dic := TDictionary<string, Boolean>.Create; // 建立字典
  try
    for value in arr do // 遍歷輸入陣列
    begin
      if not dic.ContainsKey(value) then // 如果字典中不包含當前值
      begin
        dic.Add(value, True); // 將當前值新增到字典中,值設定為 True
      end;
    end;

    Result := dic.Keys.ToArray; // 將字典的鍵(唯一元素)轉換為陣列並返回
  finally
    dic.Free; // 釋放字典物件
  end;
end;

注意,重複新增字典中已存在的KEY 會報錯,所以需要用ContainsKey方法來判斷一下當前KEY是否已經存在,如果沒有再新增進字典.

上面的紅字部分程式碼稍微修改一下,也可以用來對相同key的值的累加:

if dic.ContainsKey(sKey) then
   dic[sKey] := dic[sKey] + SuNumber
else
   dic.Add(sKey, SuNumber);

示例二: 對字典進行排序.這裡注意一下,字典是一個開放雜湊表,無法直接排序.

function TForm2.SortDic(dic: TDictionary<string, integer>): TStringList;
begin
  var sl := TStringList.Create;
  try
    for var k in dic.keys do
    begin
      sl.Add(k + '@' + IntToStr(dic[k]));
    end;
    sl.Sorted := true;  //對TStringList進行自動排序
  finally
    result := sl;
  end;
end;

//使用

var sl:=TStringList.Create;
sl:=SortDic(dic)

上面的程式碼,把字典裡的K,V用"@"符號拼接了起來,塞進一個TStringList類裡.字典不可以排序,但是TStringList可以啊,只是在使用裡,需要SPLIT一下元素才行

sl := SortDic(dic);
k := 2;
for var key in sl do
begin
    var temparr := key.Split(['@']);
    ws2.range['E' + inttostr(k) + ':K' + inttostr(k)].value := VarArrayOf([temparr[0],temparr[5], temparr[1], temparr[2], '新刀具區', 0, temparr[4]]);
    k := k + 1;
end;

上面這段程式碼是把TStringList裡面的資料寫進EXCEL單元格里.

相關文章