2010-05-19 3 views
16

델파이 6에 고유 맵 구현이 존재합니까 (값과 객체에 대한 맵 키) - 인터넷은 지금까지 도움이되지 않았습니다. 방금 델파이 프로젝트가 내 컴퓨터에 버려졌습니다. 내 배경은 C++과 java이고 델파이 프로젝트의 이전 개발자는 모든 검색을 선형 적으로 수행합니다.Delphi 6에서지도 또는 해시 테이블과 같은 것이 있습니까?

감사합니다.

+2

델파이 6에서 당신이하려는 일에 대해 Andreas의 대답과 함께 하겠지만, TStringList는 조금 제한되어 있습니다. C++ STL에서 볼 수있는 것과 같은 진정한 제네릭 컨테이너를 원한다면 Delphi 2010이 필요합니다 (Delphi 2009에서 도입되었지만 다음 버전까지는 수정되지 않은 일부 결함이 있습니다). 일반 맵 구현은 Generics.Collections 단위의 TDictionary입니다. –

답변

10

정확한 요구에 따라 TStringList 개체를 사용할 수 있습니다.

+0

문자열을 다른 문자열에 매핑하려고합니다. map.put ("apple", "round looking fruit"); map.get ("apple"); // "round looking fruit"를 반환합니다. – LoudNPossiblyWrong

+4

TStringlist는 다음과 같이 할 수 있습니다 : MyStringlist.Values ​​[ 'apple'] : = 'round looking fruit';'를 지정하고'S : = MyStringlist.Values ​​[ 'apple'];' 읽으려면 – mjn

+0

+1 TStringList는 정렬 후 조회를 위해 이진 검색을 사용합니다. –

4

Jedi Code Library에는 몇 가지 고급 컨테이너 클래스가 포함되어 있습니다. 인터페이스는 예를 들어, JclContainerIntf.pas에 선언되어있다 :

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

내가 사용할 수있는 기본 라이브러리가 있는지 알고 계십니까? 프로젝트에 다른 라이브러리를 추가하는 것을 피하려고합니다. – LoudNPossiblyWrong

+2

Java와 비교할 때 코어 런타임 라이브러리는 Delphi에서 아주 작습니다. TObjectList 및 TInterfaceList와 같은 객체에 대한 상위 컨테이너 클래스가 있지만 그다지 많지 않습니다. – mjn

5

좀 THashTable 구현하고 두 구현 사이의 차이가 최소이며, (dicotomical 정렬 구현) 대부분의 경우 TStringList를 더 효율적 TStringList를 테스트하고있다 THashTable보다.
작은 수의 값의 경우 TStringList는 해시보다 빠르며 많은 수의 값에 대해 충돌을 최소화하기 위해 복잡한 해시 함수를 찾아야하며이 복잡성으로 인해 HashList의 효율성이 떨어집니다.

개체 StringList의 포인터를 사용하여 필요한 모든 정보 (두 번째 문자열)를 저장해야합니다.

감사합니다.

+0

감사합니다 메이슨. ;-) –

7

I've는 인 Ciaran 맥 크리시에서 Hashes.pas라는 라이브러리를 사용하지만, 자신의 웹 사이트를 더 이상 사용할 수 없기 때문에 다음 URL에서 하나의 PAS 파일을 볼 수 있습니다

Link to Cian McCreesh - Hashes.pas

또한 찾을 수 있습니다 그것은 텍스트와 구글과 :

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

O : 다음 작업을 수행 할 수있는이 라이브러리를

를 "기술자에게 맥 크리시는 해시" 객체 :

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

희망 사항은 나뿐만 아니라 당신을 위해서입니다.

추신 : 저는 Ares AudioGalaxy 프로젝트에서도 사용한다고 생각합니다.

+1

Google 캐시에서 여기로 복사했습니다 : http://pastebin.com/HkWAGFbe. 다행히도 Ciaran은 괜찮을 것입니다. –

관련 문제