Implementacja tablicy assocjacyjnej

0

Cześć,
potrzebuje zaimplementować coś w stylu tablicy assocjacyjnej gdzie wiem, że w Delphi/Lazarus taki twór praktycznie nie istnieje.

Znalazłem rozwiązanie ze stworzeniem takiej pseudo tablicy za pomocą TStringList:

List.TStringList.Create; 
List.Add('Nr=10');

Wtedy moge odnosci sie do takich elementów za pomocą List.Values['Nr'] i otrzymuje 10.

Problem w tym, że nie chciałbym przechowywać w takiej tablicy pojedynczych wartości ale całe rekordy.
Pomyślałem, że możnaby stworzyć po prostu takie rekordy i w tablicy trzymać jedynie wskaźniki do nich.

I tutaj pojawia się moje pytanie. Czy w stworzonej w ten sposób tablicy jest możliwość przechowywania wskaźników? Wiem, że wskaźnik to po prostu adres ale czy praktycznie jest to wykonalne?

Jeżeli tak to jak potem odnieść się do jakiś wartości w takim rekordzie po pobraniu wskaźnika na niego?

pozdrawiam!

0

Czy w stworzonej w ten sposób tablicy jest możliwość przechowywania wskaźników ?
Z pewnością można przechowywać wskaźniki do obiektów dziedziczących z klasy Tobject.
Próbowałem coś takiego z rekordami ale nie udało mi się więc zamieniłem rekordy na obiekty

8
karpov napisał(a):

Cześć,
potrzebuje zaimplementować coś w stylu tablicy assocjacyjnej gdzie wiem, że w Delphi/Lazarus taki twór praktycznie nie istnieje.

Naprawdę? No to zobaczmy:

type
  TFooRec = record
    A : string;
    B : string;
    C : string;
    D : string;
    Num : Currency;
  end;
var
  lDict : TDictionary<string, TFooRec>;
  I     : Integer;
  lRec  : TFooRec;
  lPair : TPair<string, TFooRec>;
begin
  lDict := TDictionary<string, TFooRec>.Create();
  try

    // dodanie elementów do słownika
    for I := 1 to 10 do
    begin
      lRec.A := IntToString(I);
      lRec.Num := i;
      lDict.Add(lRec.A, lRec);
    end;

    // iteracja po elementach słownika
    for lPair in lDict do
      lRec := lPair.Value;

    // odszukanie rekordu po kluczu i pobranie rekrodu
    if lDict.TryGetValue('1', lRec) then
      ShowMessage('Odnaleziono element w słowniku o kluczu [1]');
  finally
    lDict.Free;
  end;
end;

Może być?
W sumie to samo da się zrobić na TList<TFooRec> i też wyszukiwać po czymś tam z tego rekordu. trzeba napisać tylko dedykowany 'Comparer', np tak:

  
lList := TList<TFooRec>.Create(TDelegatedComparer<TFooRec>.Create(
                                   function(const Left, Right : TFooRec) : integer
                                   begin
                                     Result := CompareText(Left.A, Right.A)
                                   end));

I wszystkie operacje wyszukiwania i sortowania wykonywane na TList, będą brały pod rozwagę wartość pola 'A' w rekordzie.

Znalazłem rozwiązanie ze stworzeniem takiej pseudo tablicy za pomocą TStringList:

To nie moja bajka, nie mam ochoty wynajdywać koła na nowo ;-)

2

@wloochacz w kontekście tego co napisał @karpov to trochę wyciągnąłeś armatę na komara :P Zwykły TStringList może zawierać obiekt

 TStringList.AddObject(nazwa, pointer(obiekt/rekord/co tam chcesz));

:)

1
List.TStringList.Create; 
List.AddObject('Nr',Pointer(Edit1));

1 użytkowników online, w tym zalogowanych: 0, gości: 1