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>; begindic := TDictionary<string, Integer>.Create; end;
示例一:对数据(数组)去重.以下代码实现了对数组元素的去重:
// RemoveDuplicates 函数接受一个字符串数组作为输入,使用字典来记录数组中的唯一元素,并返回去重后的数组。
function RemoveDuplicates(const arr: TArray<string>): TArray<string>;
vardic: TDictionary<string, Boolean>; // 声明 TDictionary 用于记录唯一元素,值为 Boolean 表示只需记录键而不需值value: string; // 用于遍历输入数组中的元素
begindic := TDictionary<string, Boolean>.Create; // 创建字典tryfor value in arr do // 遍历输入数组beginif not dic.ContainsKey(value) then // 如果字典中不包含当前值begindic.Add(value, True); // 将当前值添加到字典中,值设置为 Trueend;end;Result := dic.Keys.ToArray; // 将字典的键(唯一元素)转换为数组并返回finallydic.Free; // 释放字典对象end;
end;
注意,重复添加字典中已存在的KEY 会报错,所以需要用ContainsKey方法来判断一下当前KEY是否已经存在,如果没有再添加进字典.
上面的红字部分代码稍微修改一下,也可以用来对相同key的值的累加:
if dic.ContainsKey(sKey) thendic[sKey] := dic[sKey] + SuNumber elsedic.Add(sKey, SuNumber);
示例二: 对字典进行排序.这里注意一下,字典是一个开放哈希表,无法直接排序.
function TForm2.SortDic(dic: TDictionary<string, integer>): TStringList; beginvar sl := TStringList.Create;tryfor var k in dic.keys dobeginsl.Add(k + '@' + IntToStr(dic[k]));end;sl.Sorted := true; //对TStringList进行自动排序finallyresult := 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 beginvar 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单元格里.