Feuilles de root

Logiciels libres, programmation et économie

Accueil » Programmation » Programmation Free Pascal » TDictionary : un dictionnaire en Free Pascal

TDictionary : un dictionnaire en Free Pascal

Introduite avec Delphi 2009, la classe TDictionary représente une collection générique de paires clé valeur.

J'ai écrit une classe équivalente pour FreePascal, reprenant la même interface. Cette classé se base sur la classe générique TFPGMap définie dans l'unité fgl.

generic TDictionary<TKey, TData> = class(specialize TFPGMap<TKey, TData>)
    property At[AKey : TKey] : TData read GetKeyData write PutKeyData;
    procedure AddOrSetValue(const AKey : TKey; AData : TData);
    function TryGetValue(const AKey : TKey; var AValue : TData) : Boolean;
    function ContainsKey(const AKey : TKey) : Boolean;
    function ContainsValue(AValue : TData) : Boolean;
end;

La méthode Add ajoute une paire clé-valeur.

La méthode AddOrSetValue ajoute une paire clé-valeur à un dictionnaire si elle n'existe pas, et modifie la valeur si la clé existe déjà.

procedure TDictionary.AddOrSetValue(const AKey : TKey; AData : TData);
begin
    if ContainsKey(AKey) then
        KeyData[AKey] := AData
    else
        Add(AKey, AData);
end;

La méthode TryGetValue tente d'obtenir la valeur associée à la clé. Elle retourne True si la donné est présente dans le dictionnaire et fournit sa valeur dans AValue. Sinon elle retourne false et conserve la valeur d'origine de AValue. Le comportement est donc légèrement différent de celui de TryGetValue de Delphi, qui retourne une valeur par défaut correspondant au type de variable.

function TDictionary.TryGetValue(const AKey : TKey; var AValue : TData
    ) : Boolean;
begin
    Result := False;
    if ContainsKey(AKey) then
    begin
        AValue := KeyData[AKey];
        Result := True;
    end;
end;

La méthode ContainsKey teste la présence d'une clé dans le dictionnaire.

function TDictionary.ContainsKey(const AKey : TKey) : Boolean;
begin
    Result := IndexOf(AKey) <> -1;
end;

La méthode ContainsValue vérifie la présence d'une valeur dans le dictionnaire.

function TDictionary.ContainsValue(AValue : TData) : Boolean;
begin
    Result := IndexOfData(AValue) <> - 1;
end;