2010-05-19 28 views
16

Có bất kỳ loại bản đồ thực hiện bản địa nào trong delphi 6 (các khóa bản đồ cho các giá trị và các đối tượng) - internet đã không có sự trợ giúp cho đến nay. Tôi chỉ có một dự án delphi bán phá giá trên của tôi, nền của tôi là c + + và java, và dev trước của dự án delphi hiện tất cả các tìm kiếm tuyến tính.Có điều gì giống như một bản đồ hoặc một hashtable trong Delphi 6?

Cảm ơn.

+2

Đối với những gì bạn đang cố gắng làm, trong Delphi 6, tôi sẽ đi với câu trả lời của Andreas, nhưng TStringList là một chút hạn chế. Nếu bạn muốn các thùng chứa chung như bạn có thể tìm thấy trong C++ STL, bạn cần Delphi 2010. (Chúng được giới thiệu trong Delphi 2009, nhưng với một số trục trặc không được sửa cho đến phiên bản tiếp theo). TDictionary, trong đơn vị Generics.Collections. –

Trả lời

10

Tùy thuộc vào nhu cầu chính xác của bạn, bạn có thể muốn sử dụng đối tượng TStringList.

+0

Tôi chỉ đang tìm bản đồ một chuỗi thành một chuỗi khác: map.put ("apple", "round looking fruit"); map.get ("apple"); // return "round looking fruit" – LoudNPossiblyWrong

+4

TStringlist có thể làm điều này: sử dụng 'MyStringlist.Values ​​['apple']: = 'vòng tìm trái cây';' để gán và 'S: = MyStringlist.Values ​​['apple'];' để đọc – mjn

+0

+1 TStringList sử dụng tìm kiếm nhị phân để tìm kiếm sau khi được sắp xếp. –

4

Jedi Code Library chứa một số lớp chứa nâng cao. Giao diện được khai báo trong JclContainerIntf.pas, ví dụ:

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

bạn có biết nếu có thư viện gốc mà tôi có thể sử dụng không? Tôi đang cố gắng tránh thêm một thư viện khác vào dự án. – LoudNPossiblyWrong

+2

So với Java, thư viện thời gian chạy lõi là khá nhỏ trong Delphi. Có một số lớp chứa mức cao hơn cho các đối tượng (như TObjectList và TInterfaceList) nhưng không nhiều hơn nữa. – mjn

5

Tôi đã thử nghiệm TStringList và một số hiện thực THashTable và sự khác biệt giữa hai ngôn ngữ là tối thiểu, và trong nhiều trường hợp TStringList (với thực hiện loại dicotomical) là hiệu quả hơn hơn THashTable.
Đối với một số lượng nhỏ các giá trị TStringList nhanh hơn Hash, và đối với một số lượng lớn các giá trị bạn phải tìm một hàm băm phức tạp để giảm thiểu va chạm, và độ phức tạp này làm giảm hiệu quả của HashList.

Bạn phải sử dụng con trỏ Đối tượng của StringList để lưu trữ tất cả thông tin bạn cần (chuỗi thứ hai).

Trân trọng.

+0

Cảm ơn Mason. ;-) –

7

Tôi đã sử dụng một thư viện gọi Hashes.pas từ Ciaran McCreesh nhưng kể từ khi trang web của mình không còn có sẵn, bạn có thể xem các tập tin PAS duy nhất từ ​​URL sau:

Link to Cian McCreesh - Hashes.pas

Bạn cũng có thể tìm thấy nó với google với nội dung: "Cian McCreesh băm"

với thư viện này bạn có thể làm như sau:

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

O đối tượng r:

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

Hy vọng nó sẽ phục vụ bạn cũng như cho tôi.

PS Tôi nghĩ rằng dự án Ares AudioGalaxy cũng sử dụng nó.

+1

Tôi đã sao chép từ bộ đệm Google vào đây: http://pastebin.com/HkWAGFbe. Hy vọng Ciaran sẽ không bận tâm. –

Các vấn đề liên quan