2010-05-19 6 views
16

Czy istnieje jakaś natywna implementacja mapy w delphi 6 (klucze map do wartości i obiektów) - internet nie był do tej pory pomocny. Właśnie dostałem projekt delphi porzucony na moim, moje tło to C++ i java, a poprzednie dev projektu delphi wykonuje wszystkie wyszukiwania liniowo.Czy istnieje coś takiego jak mapa lub hashtable w Delphi 6?

Dzięki.

+2

Za to, co próbujesz zrobić, w Delphi 6, pójdę z odpowiedzią Andreasa, ale TStringList jest trochę ograniczony. Jeśli potrzebujesz prawdziwych pojemników generycznych, takich jak w C++ STL, potrzebujesz Delphi 2010. (Zostały one wprowadzone w Delphi 2009, ale z pewnymi trzaskami, które nie zostały naprawione aż do następnej wersji.) Ogólna implementacja mapy jest nazywana TDictionary, w jednostce Generics.Collections. –

Odpowiedz

10

W zależności od Twoich konkretnych potrzeb, możesz użyć obiektu TStringList.

+0

Po prostu szukam odwzorowania ciągu na inny ciąg: map.put ("apple", "round looking fruit"); map.get ("apple"); // zwraca "okrągły wyglądający owoc" – LoudNPossiblyWrong

+4

TStringlist może to zrobić: użyj 'MyStringlist.Values ​​['apple']: = 'round looking fruit';' do przypisania i 'S: = MyStringlist.Values ​​['apple'];' do odczytu – mjn

+0

+1 TStringList używa binarnego wyszukiwania dla wyszukiwań po posortowaniu. –

4

Jedi Code Library zawiera niektóre zaawansowane klasy kontenerów. Interfejsy są zadeklarowane w JclContainerIntf.pas, na przykład:

IJclMap = interface(IJclContainer) 
    ['{A7D0A882-6952-496D-A258-23D47DDCCBC4}'] 
    procedure Clear; 
    function ContainsKey(Key: TObject): Boolean; 
    function ContainsValue(Value: TObject): Boolean; 
    function Extract(Key: TObject): TObject; 
    function GetValue(Key: TObject): TObject; 
    function IsEmpty: Boolean; 
    function KeyOfValue(Value: TObject): TObject; 
    function KeySet: IJclSet; 
    function MapEquals(const AMap: IJclMap): Boolean; 
    procedure PutAll(const AMap: IJclMap); 
    procedure PutValue(Key, Value: TObject); 
    function Remove(Key: TObject): TObject; 
    function Size: Integer; 
    function Values: IJclCollection; 
    property Items[Key: TObject]: TObject read GetValue write PutValue; 
     {$IFNDEF BUGGY_DEFAULT_INDEXED_PROP} default; {$ENDIF ~BUGGY_DEFAULT_INDEXED_PROP} 
    end; 
+0

Czy wiesz, czy istnieje biblioteka natywna, z której mogę korzystać? Próbuję uniknąć dodania kolejnej biblioteki do projektu. – LoudNPossiblyWrong

+2

W porównaniu z Javą, biblioteka rdzenia czasu pracy jest dość mała w Delphi. Istnieją pewne klasy kontenerów wyższego poziomu dla obiektów (jak TObjectList i TInterfaceList), ale niewiele więcej. – mjn

5

Ja testowałem TStringList a niektóre THashTable implementacje i różnice między tymi dwoma implementacje są minimalne, aw większości przypadków TStringList (z dicotomical realizacji sortowania) są bardziej wydajne niż THashTable.
Dla małej liczby wartości TStringList jest szybszy niż Hash, a dla dużej liczby wartości należy znaleźć złożoną funkcję mieszającą, aby zminimalizować kolizję, a ta złożoność zmniejsza wydajność HashList.

Należy użyć wskaźnika Obiekt do zapisania wszystkich potrzebnych informacji (drugi ciąg znaków).

Pozdrawiam.

+0

Dzięki Mason. ;-) –

7

Ive używane biblioteki o nazwie Hashes.pas z Ciaran McCreesh ale ponieważ jego strona jest już dostępna widać pojedynczy plik PAS z następującego adresu URL:

Link to Cian McCreesh - Hashes.pas

można również znaleźć to z google z tekstem: "Cian McCreesh wartości mieszania"

z tej biblioteki można wykonać następujące czynności:

aString := TStringHash.Create; 
aString['color'] := 'blue'; 
ShowMessage(aString.Items['color']); // blue 

o r obiekty:

aObj := TObjectHash.Create; 
aObj['color'] := TBlueClass.Create; 
bcBlue:=(aObj.Items['color'] as TBlueClass); 
ShowMessage(bcBlue.Name); // Blue (supposing the TBLusClass as a Name property... 

Mam nadzieję, że służy zarówno Tobie, jak i mnie.

PS Myślę, że projekt Ares AudioGalaxy również go wykorzystuje.

+1

Skopiowałem to z pamięci podręcznej Google do tego miejsca: http://pastebin.com/HkWAGFbe. Mam nadzieję, że Ciaran nie będzie miał nic przeciwko. –

Powiązane problemy